目錄
1.算法運行效果圖預覽
2.算法運行軟件版本
3.部分核心程序
4.算法理論概述
4.1 DCT離散余弦變換
4.2 IDCT逆離散余弦變換
4.3 樹結構實現1024點IDCT的原理
5.算法完整程序工程
1.算法運行效果圖預覽
(完整程序運行后無水印)
matlab仿真結果
FPGA仿真結果
? ? ? ?由于FPGA中的數據通常采用定點表示,在計算過程中會引入量化和舍入誤差。因此,上述FPGA的測試結果,在數值較小時,和MATLAB存在一點誤差。
2.算法運行軟件版本
vivado2019.2
Matlab2022a
3.部分核心程序
(完整版代碼包含詳細中文注釋和操作步驟視頻)
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 19:52:27 04/01/2014
// Design Name:
// Module Name: myDD16
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//
module myDD16(x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,x15,x16,Z1,Z2,Z3,Z4,Z5,Z6,Z7,Z8,Z9,Z10,Z11,Z12,Z13,Z14,Z15,Z16);input signed[15:0] x1;
input signed[15:0] x2;
input signed[15:0] x3;
input signed[15:0] x4;
input signed[15:0] x5;
input signed[15:0] x6;
input signed[15:0] x7;
input signed[15:0] x8;
input signed[15:0] x9;
input signed[15:0] x10;
input signed[15:0] x11;
input signed[15:0] x12;
input signed[15:0] x13;
input signed[15:0] x14;
input signed[15:0] x15;
input signed[15:0] x16;
output signed[15:0]Z1;
output signed[15:0]Z2;
output signed[15:0]Z3;
output signed[15:0]Z4;
output signed[15:0]Z5;
output signed[15:0]Z6;
output signed[15:0]Z7;
output signed[15:0]Z8;
output signed[15:0]Z9;
output signed[15:0]Z10;
output signed[15:0]Z11;
output signed[15:0]Z12;
output signed[15:0]Z13;
output signed[15:0]Z14;
output signed[15:0]Z15;
output signed[15:0]Z16;//STEP1
//STEP1
wire signed[15:0]s11_1;
wire signed[15:0]s11_2;
wire signed[15:0]s11_3;
wire signed[15:0]s11_4;
wire signed[15:0]s11_5;
wire signed[15:0]s11_6;
wire signed[15:0]s11_7;
wire signed[15:0]s11_8;assign s11_1 = x1 + x16;
assign s11_2 = x2 + x15;
assign s11_3 = x3 + x14;
assign s11_4 = x4 + x13;
assign s11_5 = x5 + x12;
assign s11_6 = x6 + x11;
assign s11_7 = x7 + x10;
assign s11_8 = x8 + x9;wire signed[31:0]s12t_1;
wire signed[31:0]s12t_2;
wire signed[31:0]s12t_3;
wire signed[31:0]s12t_4;
wire signed[31:0]s12t_5;
wire signed[31:0]s12t_6;
wire signed[31:0]s12t_7;
wire signed[31:0]s12t_8;
assign s12t_1 = (x1 - x16)*32610;
assign s12t_2 = (x2 - x15)*31357;
assign s12t_3 = (x3 - x14)*28899;
assign s12t_4 = (x4 - x13)*25330;
assign s12t_5 = (x5 - x12)*20788;
assign s12t_6 = (x6 - x11)*15447;
assign s12t_7 = (x7 - x10)*9512;
assign s12t_8 = (x8 - x9)*3212;wire signed[15:0]s12_1;
wire signed[15:0]s12_2;
wire signed[15:0]s12_3;
wire signed[15:0]s12_4;
wire signed[15:0]s12_5;
wire signed[15:0]s12_6;
wire signed[15:0]s12_7;
wire signed[15:0]s12_8;
assign s12_1 = s12t_1[29:14];
assign s12_2 = s12t_2[29:14];
assign s12_3 = s12t_3[29:14];
assign s12_4 = s12t_4[29:14];
assign s12_5 = s12t_5[29:14];
assign s12_6 = s12t_6[29:14];
assign s12_7 = s12t_7[29:14];
assign s12_8 = s12t_8[29:14];//STEP2
//STEP2
wire signed[15:0]Y1_1;
wire signed[15:0]Y1_2;
wire signed[15:0]Y1_3;
wire signed[15:0]Y1_4;
wire signed[15:0]Y1_5;
wire signed[15:0]Y1_6;
wire signed[15:0]Y1_7;
wire signed[15:0]Y1_8;
wire signed[15:0]Y2_1;
wire signed[15:0]Y2_2;
wire signed[15:0]Y2_3;
wire signed[15:0]Y2_4;
wire signed[15:0]Y2_5;
wire signed[15:0]Y2_6;
wire signed[15:0]Y2_7;
wire signed[15:0]Y2_8;
myDD8 U1(
.x1(s11_1),
.x2(s11_2),
.x3(s11_3),
.x4(s11_4),
.x5(s11_5),
.x6(s11_6),
.x7(s11_7),
.x8(s11_8),
.Z1(Y1_1),
.Z2(Y1_2),
.Z3(Y1_3),
.Z4(Y1_4),
.Z5(Y1_5),
.Z6(Y1_6),
.Z7(Y1_7),
.Z8(Y1_8)
);
myDD8 U2(
.x1(s12_1),
.x2(s12_2),
.x3(s12_3),
.x4(s12_4),
.x5(s12_5),
.x6(s12_6),
.x7(s12_7),
.x8(s12_8),
.Z1(Y2_1),
.Z2(Y2_2),
.Z3(Y2_3),
.Z4(Y2_4),
.Z5(Y2_5),
.Z6(Y2_6),
.Z7(Y2_7),
.Z8(Y2_8)
);//Reorder
//Reorderassign Z1=Y1_1;
assign Z3=Y1_2;
assign Z5=Y1_3;
assign Z7=Y1_4;
assign Z9=Y1_5;
assign Z11=Y1_6;
assign Z13=Y1_7;
assign Z15=Y1_8;
assign Z2={Y2_1[15],Y2_1[15:1]};
assign Z4=Y2_2-Z2;
assign Z6=Y2_3-Z4;
assign Z8=Y2_4-Z6;
assign Z10=Y2_5-Z8;
assign Z12=Y2_6-Z10;
assign Z14=Y2_7-Z12;
assign Z16=Y2_8-Z14;endmodule
23_019m
4.算法理論概述
? ? ? 在數字信號處理領域,離散余弦變換(Discrete Cosine Transform, DCT)及其逆變換(Inverse Discrete Cosine Transform, IDCT)扮演著重要角色。
4.1 DCT離散余弦變換
? ? ? ?對于一個長度為?N?的一維離散信號?x(n),n=0,1,?,N?1,其?N?點離散余弦變換(DCT - II)定義為:
4.2 IDCT逆離散余弦變換
4.3 樹結構實現1024點IDCT的原理
? ? ? ?樹結構實現 1024 點 IDCT 的核心思想是分治策略。將一個 1024 點的 IDCT 問題分解為兩個 512 點的 IDCT 問題,每個 512 點的 IDCT 問題又可以進一步分解為兩個 256 點的 IDCT 問題,以此類推,直到分解為 8 點的 IDCT 問題。
? ? ? 通過上述的結構,最終可以將問題歸結為8點IDCT的計算。對于8點IDCT,設輸入系數為Z(k),k=0,1,?,7,輸出為z(n),n=0,1,?,7,其計算公式為:
? ? ? ?具體來說,首先對輸入的1024點IDCT系數進行分組,得到兩個512點IDCT的輸入系數;然后對每個512點IDCT的輸入系數再進行分組,得到兩個256點IDCT的輸入系數,以此類推,直到得到多個8點IDCT的輸入系數。接著,計算所有8點IDCT的結果;再根據這些結果計算256點IDCT的結果;然后根據256點IDCT的結果計算512點IDCT的結果;最后根據512點IDCT的結果計算1024點IDCT的結果。
5.算法完整程序工程
OOOOO
OOO
O