看了奧本海姆的信號與系統的卷積和之後就想用FPGA實現一下,首先用MATLAB仿真,MATLAB有現成的卷積函數,用輸入變量un卷積xn相當於xn通過一個累加系統。
卷積是倒序乘累加,但是如果看成兩個多項式相乘相乘對象係數就是卷積對象,相乘結果係數就是卷積結果。以下是輸入函數xn,系統函數hn(取un),xn累加結果,MATLAB自帶卷積函數,我寫的卷積函數的結果圖:
輸入xn是單位階躍函數un的額時候:
輸入xn是指數函數的時候:
源碼:
clear;clc;close all;
Scale = 1000;
un = ones(1,Scale);
nun = 0:length(un)-1;
%%這個是輸入2^n的結果
% x = zeros(1,Scale);
% for r2 = 1:Scale/10
% for r = 1:10
% x(10*(r2-1)+r) = 2^r;
% end
% end
x = ones(1,Scale);
nx = 0 : length(x)-1;
y_x = zeros(1,length(un) + length(x)-1);
for r = 1 : length(un) + length(x)-1
if r == 1
y_x(r) = x(r) ;
else
if r<=length(x)-1
y_x(r) = y_x(r-1) + x(r) ;
else
y_x(r) = y_x(r-1) ;
end
end
end
ny_x = 1 : length(un) + length(x)-1;
my_y_hx = my_conv(un,x)
nmy_y_hx = 0 : length(my_y_hx)-1
y_hx = conv(un,x);%my_conv(un,x);
ny_hx = 0 : length(y_hx)-1;
subplot(511);
stem(nx,x);
xlabel('nx');
ylabel('x輸入函數');
grid on;
subplot(512);
stem(nun,un);
xlabel('nun');
ylabel('un階躍函數');
grid on;
subplot(513);
stem(ny_x,y_x);
xlabel('ny_x');
ylabel('y_x直接算遞增的結果');
grid on;
subplot(514);
stem(nmy_y_hx,my_y_hx);
xlabel('nmy_y_hx');
ylabel('my_y_hx自己寫的卷積結果');
grid on;
subplot(515);
stem(ny_hx,y_hx);
xlabel('ny_hx');
ylabel('y_hx卷積系統函數得出');
grid on;
我寫的卷積:
function y = my_conv( x,h )
nx = length(x);
nh = length(h);
y = zeros(1,nx+nh-1);
for index = 1:nx
indexSum = x(index)*h;
y(1,index:index+nh-1) = y(1,index:index+nh-1)+indexSum;
end
end
之後就是將其Verilog化,見下一篇:https://blog.csdn.net/Mr_liu_666/article/details/103372507
FPGAVGA顯示,見下下篇:https://blog.csdn.net/Mr_liu_666/article/details/103376238