看了奥本海姆的信号与系统的卷积和之后就想用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