Triển khai DCT nhanh


7

Tôi gặp khó khăn khi tìm hiểu làm thế nào để làm theo sơ đồ thuật toán DCT nhanh 8 x 8 được tìm thấy trong hai bài báo sau:

(1) Thuật toán tính toán nhanh cho phép biến đổi Cosine rời rạc của Chen et al.

(2) Các thuật toán DCT 1-D nhanh thực tế với 11 phép nhân của Loeffler et al.

Cụ thể, sơ đồ thứ hai hiển thị thuật toán trong (2) trông giống như sau:

nhập mô tả hình ảnh ở đây

Mô tả các hoạt động trong thuật toán này là:

nhập mô tả hình ảnh ở đây

Có một vài câu hỏi tôi có về công thức này và tôi không biết tìm câu trả lời ở đâu:

  1. (2) đề xuất rằng thuật toán này tạo ra một DCT được chia tỷ lệ theo một số giá trị . Nó đề cập rằng này được chọn tùy ý để tránh bất kỳ phép nhân nào trong việc tính toán hệ số DC. Thực sự yêu cầu duy nhất là . Vì vậy, câu hỏi của tôi là: hệ số tỷ lệ của các hệ số đầu ra sử dụng thuật toán này là gì? Có vẻ như chúng khác với định nghĩa ban đầu của DCT, nhưng tôi không biết bao nhiêu (chủ yếu là vì tôi thực sự không thấy bất kỳ mối quan hệ nào giữa sơ đồ này và công thức ban đầu của DCT): trong đóC=2CCDCTCIDCT=4N2

    F(k)=2c(k)Nn=0N1f(n)cos((2n+1)πk2N)
    c(k)=12cho và với .k=0c(k)=1k0
  2. Bài viết nói rằng việc thực hiện IDCT có thể được thực hiện bằng cách sử dụng cùng một thuật toán nhưng chuyển đổi đầu ra thành đầu vào và ngược lại. Đầu tiên, các hệ số DCT có nên được sắp xếp theo thứ tự ngược bit trước khi chạy chúng thông qua IDCT không? Thứ hai, đối với các khối xoay (hình vuông trong sơ đồ), không nên thao tác nghịch đảo là: Lý do của tôi là thế này: Nghịch đảo của một phép quay bởi là một phép quay của . Do đó, chúng ta chỉ cần thay thế góc bằng nghịch đảo của nó và sử dụng danh tính và

    O0=I0kcosnπ2NI1ksinnπ2NO1=I1ksinnπ2N+I1kcosnπ2N
    θθcos(θ)=cos(θ)sin(θ)=sin(θ) . Thứ ba, hệ số tỷ lệ của các giá trị được chuyển đổi sau IDCT là gì? (2) nói , nhưng theo kinh nghiệm, điều này không tạo ra kết quả chính xác.2N2
  3. Giả sử sau khi tôi chạy thuật toán, tôi có kết quả của mỗi làn được lưu trong các giá trị d0 ... d7. Điều nào sau đây là đúng:

    đầu ra [0] = d0 hoặc đầu ra [0] = d0
    đầu ra [4] = d1 đầu ra [1] = d4
    đầu ra [2] = d2 đầu ra [2] = d2
    đầu ra [6] = d3 đầu ra [3] = d6
    đầu ra [7] = d4 đầu ra [4] = d7
    đầu ra [3] = d5 đầu ra [5] = d3
    đầu ra [5] = d6 đầu ra [6] = d5
    đầu ra [1] = d7 đầu ra [7] = d1 

Nếu có bất kỳ cách nào để cải thiện câu hỏi này, hoặc nếu tôi nên hỏi ở nơi khác, xin vui lòng cho tôi biết.


Để thực tế trả lời các loại câu hỏi này, những gì bạn thực sự cần là một tập hợp các giá trị DCT được tính toán trước và điều chỉnh việc thực hiện của bạn cho đến khi kết quả của nó phù hợp với những câu hỏi được tính toán trước ....
Fat32

Tôi có tất cả những câu hỏi đó và nhiều hơn nữa ... bạn đã bao giờ tìm ra nó chưa? Tôi tìm thấy một số triển khai C mà tôi cố gắng trích xuất mẫu công cụ. Tôi sẽ viết một cái gì đó nếu tôi tìm thấy câu trả lời.
Pepijn

Câu trả lời:


4

Được rồi, sau vài ngày nhìn chằm chằm vào vấn đề này, tôi hy vọng tôi có thể cung cấp một chút hướng dẫn cho linh hồn tội nghiệp tiếp theo.

  1. Có quy mô là khác nhau. So với scipy.fftpack.dctthuật ngữ DC là và các thuật ngữ khác . Nhưng rõ ràng tất cả đều hủy bỏ một cách độc đáo trong biến đổi nghịch đảo.1222
  2. Thứ tự đầu vào nghịch đảo là chính xác khi chúng xuất hiện: bit đảo ngược. Nghĩa đen như thể bạn lật xung quanh hình và kết nối các dòng. Và vâng, bạn đúng rằng tội lỗi bị trừ. Tôi đang thấy hệ số tỷ lệ là 8, FWIW.
  3. Thứ tự đầu ra của nghịch đảo giống như thứ tự đầu vào của biến đổi chuyển tiếp. Vậyx[n]=IDCT(DCT(x[n]))8

Cũng lưu ý rằng có một lỗi trong biểu đồ và đó là cho khối xoay bên chẵn.2c6


Cảm ơn đã dành thời gian để trả lời những câu hỏi này! Động lực ban đầu của tôi cho điều này là trong bối cảnh thuật toán nén 2D, vì vậy tôi vẫn không rõ ràng về thứ tự tương đối của các đầu ra (Tôi muốn chúng từ 0-7 để tôi có thể có chúng từ nhỏ nhất đến lớn nhất). Chúng không bị đảo ngược chút nào: 3 -> 5, 5 -> 6, 7 -> 1 không chính xác là đảo ngược bit (hoặc tôi đã hiểu nhầm ở đây).
Mokosha

1
Thứ tự khớp với en.wikipedia.org/wiki/Bit-reversal_permuting vì vậy có điều đó. Tất nhiên bạn có thể sắp xếp lại chúng theo ý muốn. Tôi sẽ đề nghị trực tiếp tính đến điều này trong bước zig-zag để tránh chi phí thêm.
Pepijn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.