matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真

%第一步: fdatool生成滤波器系数,将其量化,并用plot查看幅频响应。
N=16;   %量化位数,即2的指数
Fs=184320000;
%量化滤波器系数
Q_hb1=round(hb1/max(abs(hb1))*(2^(N-1)-1));
hn=Q_hb1;
%求滤波器的幅频响应
m_hb1=20*log(abs(fft(hb1,1024)))/log(10);m_hb1=m_hb1-max(m_hb1);
Q_hb1=20*log(abs(fft(Q_hb1,1024)))/log(10);Q_hb1=Q_hb1-max(Q_hb1);
%设置幅频响应的横坐标单位为Hz
x_f=[0:(Fs/length(m_hb1)):Fs/2];
%只显示正频率部分的幅频响应
m5=m_hb1(1:length(x_f));
m6=Q_hb1(1:length(x_f));
%绘制幅频响应曲线
plot(x_f,m5,'-',x_f,m6,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('未量化','12bit量化');
grid;
matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第1张图片

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第2张图片


%第二步:matlab生成测试数据,并经过滤波器。
f1=5000000;           %信号1频率为5mHz
f2=15000000;         %信号2频率为15mHz
f3=25000000;         %信号3频率为25mHz
f4=100000000;         %信号4频率为100mHz
Fs=184320000;      %采样频率为184.32mHz
%产生信号
t=0:1/Fs:20/f1;
c1=2*pi*f1*t;
c2=2*pi*f2*t;
c3=2*pi*f3*t;
c4=2*pi*f4*t;
s1=sin(c1);%产生正弦波
s2=sin(c2);%产生正弦波
s3=sin(c3);%产生正弦波
s4=sin(c4);%产生正弦波
s=s1+s2+s3+s4;   %产生合成后的信号
%产生随机序列信号高斯白噪声
noise=randn(1,length(t));

%归一化处理
noise=noise/max(abs(noise));
s=s/max(abs(s));

%16比特量化
Q_noise=round(noise*(2^(N-1)-1));
Q_s=round(s*(2^(N-1)-1));
%调用自已设计的滤波器函数对信号进行滤波
Filter_noise=filter(hn,1,Q_noise);
Filter_s=filter(hn,1,Q_s);

%求信号的幅频响应
m_noise=20*log(abs(fft(Q_noise,1024)))/log(10); m_noise=m_noise-max(m_noise);
m_s=20*log(abs(fft(Q_s,1024)))/log(10); m_s=m_s-max(m_s);
%滤波后的幅频响应
Fm_noise=20*log(abs(fft(Filter_noise,1024)))/log(10); Fm_noise=Fm_noise-max(Fm_noise);
Fm_s=20*log(abs(fft(Filter_s,1024)))/log(10); Fm_s=Fm_s-max(Fm_s);
%滤波器本身的幅频响应
m_hn=20*log(abs(fft(hn,1024)))/log(10); m_hn=m_hn-max(m_hn);

%设置幅频响应的横坐标单位为Hz
x_f=[0:(Fs/length(m_s)):Fs/2];
%只显示正频率部分的幅频响应
mf_noise=m_noise(1:length(x_f));
mf_s=m_s(1:length(x_f));
Fmf_noise=Fm_noise(1:length(x_f));
Fmf_s=Fm_s(1:length(x_f));
Fm_hn=m_hn(1:length(x_f));

%绘制幅频响应曲线
subplot(211)
plot(x_f,mf_noise,'-.',x_f,Fmf_noise,'-',x_f,Fm_hn,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');title('Matlab仿真白噪声信号滤波前后的频谱');
legend('输入信号频谱','输出信号频谱','滤波器响应');
grid;

subplot(212)
plot(x_f,mf_s,'-.',x_f,Fmf_s,'-',x_f,Fm_hn,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');title('Matlab仿真合成单频信号滤波前后的频谱');
legend('输入信号频谱','输出信号频谱','滤波器响应');
grid;

%将生成的数据以十进制数据格式写入txt文件中
fid=fopen('D:\E4_7_Int_noise.txt','w');
fprintf(fid,'%8d\r\n',Q_noise);
fclose(fid);

fid=fopen('D:\E4_7_Int_s.txt','w');
fprintf(fid,'%8d\r\n',Q_s);
fclose(fid);

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第3张图片

%先滤波后2倍抽取的信号的幅频响应   错误,还未修改
n=2;
 y = downsample(x, n);

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第4张图片

%先抽取后滤波的信号

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第5张图片 %所以信号应该是先经过滤波器再经过抽取

 


%第三步:ISE使用IP核生成fir滤波器,将并用modelsim仿真,得到滤波后的数据。

%第四步:将FPGA滤波后的数据,在matlab中得到其幅频响应。

%从文本文件中读取数据
%原测试数据
fid=fopen('D:\E4_7_Int_noise.txt','r');
[Noise_in,N_n]=fscanf(fid,'%lg',inf);
fclose(fid);

fid=fopen('D:\E4_7_Int_s.txt','r');
[S_in,S_n]=fscanf(fid,'%lg',inf);
fclose(fid);
%FPGA滤波后的数据
fid=fopen('D:\E4_7_Noiseout.txt','r');
[Noise_out,N_count]=fscanf(fid,'%lg',inf);
fclose(fid);

fid=fopen('D:\E4_7_Sout.txt','r');
[S_out,S_count]=fscanf(fid,'%lg',inf);
fclose(fid);

%归一化处理
Noise_out=Noise_out/max(abs(Noise_out));
S_out=S_out/max(abs(S_out));
Noise_in=Noise_in/max(abs(Noise_in));
S_in=S_in/max(abs(S_in));

%求信号的幅频响应
out_noise=20*log(abs(fft(Noise_out,1024)))/log(10); out_noise=out_noise-max(out_noise);
out_s=20*log(abs(fft(S_out,1024)))/log(10); out_s=out_s-max(out_s);

in_noise=20*log(abs(fft(Noise_in,1024)))/log(10); in_noise=in_noise-max(in_noise);
in_s=20*log(abs(fft(S_in,1024)))/log(10); in_s=in_s-max(in_s);
%滤波器本身的幅频响应
m_hn=20*log(abs(fft(hn,1024)))/log(10); m_hn=m_hn-max(m_hn);

%设置幅频响应的横坐标,单位hz
x_f=[0:(Fs/length(out_noise)):Fs/2];
%只显示正频率部分的幅频响应
mf_noise=out_noise(1:length(x_f));
mf_s=out_s(1:length(x_f));
mf_in_noise=in_noise(1:length(x_f));
mf_in_s=in_s(1:length(x_f));
mf_hn=m_hn(1:length(x_f));
%绘制幅频响应曲线
figure(1);
subplot(211);
plot(x_f,mf_in_noise,'--',x_f,mf_noise,'-',x_f,mf_hn,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');title('FPGA仿真白噪声信号滤波前后的频谱');
legend('输入信号频谱','输出信号频谱','滤波器响应');
grid;
subplot(212);
plot(x_f,mf_in_s,'--',x_f,mf_s,'-',x_f,mf_hn,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');title('FPGA仿真合成单频信号滤波前后的频谱');
legend('输入信号频谱','输出信号频谱','滤波器响应');
grid;

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第6张图片

%IP核经过了2 decimateion,是对称的

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第7张图片

 将2 decimation的重复数据滤除,后的观察

matlab生成fir系数coe,ISE生成fir的IP核,并调用coe文件,ISE仿真后,将结果用matlab仿真_第8张图片

 

 

 

 

 

你可能感兴趣的:(matlab)