数字滤波器的MATLAB与FPGA实现之读书笔记(三 FIR滤波器的FPGA设计与实现)

8 篇文章 22 订阅

第四章 FIR滤波器的FPGA设计与实现

1、不同结构的FIR滤波器特性

2、FIR滤波器的MATLAB设计

2.1 采用fir1函数设计

采用海明窗,分别设计长度为41(阶数为40)的低通(截止频率为200Hz)、高通(截止频率为200 Hz)、带通(通带为200~400 Hz)、带阻滤波器(阻带为200~400 Hz)FIR滤波器,采样频率为2000 Hz,画出其脉冲响应及幅频响应图。

%E4_1_fir1.m文件的源代码
N=41;      %滤波器长度
fs=2000;   %采样频率
%各种滤波器的特征频率
fc_lpf=200; %低通截止频率
fc_hpf=200; %高通截止频率
fp_bandpass=[200 400];  %通带为200~400Hz
fc_stop=[200 400];  %阻带为200~400Hz

%以采样频率的一半,对频率进行归一化处理
wn_lpf=fc_lpf*2/fs;
wn_hpf=fc_hpf*2/fs;
wn_bandpass=fp_bandpass*2/fs;
wn_stop=fc_stop*2/fs;

%采用fir1函数设计FIR滤波器
b_lpf=fir1(N-1,wn_lpf);
b_hpf=fir1(N-1,wn_hpf,'high');
b_bandpass=fir1(N-1,wn_bandpass,'bandpass');
b_stop=fir1(N-1,wn_stop,'stop');

%求滤波器的幅频响应
m_lpf=20*log(abs(fft(b_lpf)))/log(10);
m_hpf=20*log(abs(fft(b_hpf)))/log(10);
m_bandpass=20*log(abs(fft(b_bandpass)))/log(10);
m_stop=20*log(abs(fft(b_stop)))/log(10);
%设置幅频响应的横从标单位为Hz
x_f=[0:(fs/length(m_lpf)):fs/2];  
%绘制单位脉冲响应
subplot(421);stem(b_lpf);xlabel('n');ylabel('h(n)');
title('低通滤波器的单位脉冲响应','fontsize',8);
subplot(423);stem(b_hpf);xlabel('n');ylabel('h(n)');
title('高通滤波器的单位脉冲响应','fontsize',8);
subplot(425);stem(b_bandpass);xlabel('n');ylabel('h(n)');
title('带通滤波器的单位脉冲响应','fontsize',8);
subplot(427);stem(b_stop);xlabel('n');ylabel('h(n)');
title('带阻滤波器的单位脉冲响应','fontsize',8);
%绘制幅频响应曲线
subplot(422);plot(x_f,m_lpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
title('低通滤波器的幅频响应','fontsize',8);
subplot(424);plot(x_f,m_hpf(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
title('高通滤波器的幅频响应','fontsize',8);
subplot(426);plot(x_f,m_bandpass(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
title('带通滤波器的幅频响应','fontsize',8);
subplot(428);plot(x_f,m_stop(1:length(x_f)));xlabel('频率(Hz)','fontsize',8);ylabel('幅度(dB)','fontsize',8);
title('带阻滤波器的幅频响应','fontsize',8);

2.2 各种窗函数性能比较

利用MATLAB软件分别设计截止频率为200 Hz、采样频率为2000 Hz的FIR低通滤波器,滤波器长度为81(80阶),并绘出各滤波器的幅度频率响应曲线。

%E4_2_windows.m文件的源代码

N=81;      %滤波器长度
fs=2000;   %采样频率
fc=200;    %低通滤波器的截止频率

%生成各种窗函数
w_rect=rectwin(N)'; %矩形窗
w_hann=hann(N)';    %汉宁窗
w_hamm=hamming(N)'; %海明窗
w_blac=blackman(N)';    %布拉克曼窗
w_kais=kaiser(N,7.856)';    %凯塞窗,形状参数为0.7856

%采用fir1函数设计FIR滤波器(时域:单位冲激响应)
b_rect=fir1(N-1,fc*2/fs,w_rect);
b_hann=fir1(N-1,fc*2/fs,w_hann);
b_hamm=fir1(N-1,fc*2/fs,w_hamm);
b_blac=fir1(N-1,fc*2/fs,w_blac);
b_kais=fir1(N-1,fc*2/fs,w_kais);


%求滤波器的幅频响应(频域:系统频率响应)
m_rect=20*log(abs(fft(b_rect,512)))/log(10);
m_hann=20*log(abs(fft(b_hann,512)))/log(10);
m_hamm=20*log(abs(fft(b_hamm,512)))/log(10);
m_blac=20*log(abs(fft(b_blac,512)))/log(10);
m_kais=20*log(abs(fft(b_kais,512)))/log(10);

%设置幅频响应的横坐标单位为Hz
x_f=[0:(fs/length(m_rect)):fs/2];
%只显示正频率部分的幅频响应
m1=m_rect(1:length(x_f));
m2=m_hann(1:length(x_f));
m3=m_hamm(1:length(x_f));
m4=m_blac(1:length(x_f));
m5=m_kais(1:length(x_f));

%绘制幅频响应曲线
plot(x_f,m1,'-',x_f,m2,'*',x_f,m3,'+',x_f,m4,'--',x_f,m5,'-.');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('矩形窗','汉宁窗','海明窗','布拉克曼窗','凯塞窗');
grid;

从结果来看,相同滤波器阶数情况下的凯塞窗函数具有更好的性能。在设计的200Hz截止频率处,幅度衰减约为-6.4dB,滤波器的3dB带宽实际约为184.3Hz。

3、FIR滤波器的FPGA实现

3.1 串行结构的FPGA实现

设计一个15阶(长度为16)的低通线性相位.FIR滤波器,采用布莱克曼窗函数设计,截止频率为500 Hz,采样频率为2000 Hz;采用FPGA实现全串行结构的滤波器,系数的量化位数为12比特输入数据位宽为12比特,输出数据位宽为29比特,系统时钟为16 kHz

设计思路:

  1. 首先采用MATLAB软件根据要求设计出滤波器的系数,并仿真出系数量化前后的幅频响应图;
  2. 根据图4-18所示的结构采用Verilog HDL 语言在FPGA中实现该滤波器;
  3. 采用MATLAB'软件仿真出具有白噪声特性的输入信号,以及由200 Hz及800 Hz单点频信号叠加的输入信号;
  4. 将仿真的输入信号作为 Verilog HDL程序的测试输入信号,用ModelSim 软件仿真滤波器输出信号;
  5. 采用MATLAB 软件分析滤波器输出信号,比较输入/输出信号的时域及频域图。

第一步、用MATLAB 软件设计出滤波器系数。

%E4_7_Fir8Serial.M
%E4_2_windows.m文件的源代码
function hn=E4_7_Fir8Serial
N=16;      %滤波器长度
fs=2000;   %采样频率
fc=500;    %低通滤波器的截止频率
B=12;      %量化位数

%生成窗函数
w_kais=blackman(N)';

%采用fir1函数设计FIR滤波器
b_kais=fir1(N-1,fc*2/fs,w_kais);
%量化滤波器系数
Q_kais=round(b_kais/max(abs(b_kais))*(2^(B-1)-1))
hn=Q_kais;
%转化成16进制数补码
Q_h=dec2hex(Q_kais+2^B*(Q_kais<0))

%求滤波器的幅频响应
m_kais=20*log(abs(fft(b_kais,1024)))/log(10); m_kais=m_kais-max(m_kais);
Q_kais=20*log(abs(fft(Q_kais,1024)))/log(10); Q_kais=Q_kais-max(Q_kais);


%设置幅频响应的横坐标单位为Hz
x_f=[0:(fs/length(m_kais)):fs/2];
%只显示正频率部分的幅频响应
m5=m_kais(1:length(x_f));
m6=Q_kais(1:length(x_f));

%绘制幅频响应曲线
plot(x_f,m5,'-',x_f,m6,'--');
xlabel('频率(Hz)');ylabel('幅度(dB)');
legend('未量化','12bit量化');
grid;

第二步、用MATLAB软件仿真滤波器测试数据、仿真测试数据经滤波器滤波后的输出数据,以便于FPGA 程序实现后的结果进行比较,并判断FPGA 程序实现的准确性。

%E4_7_NoiseAndCarrier.M
f1=200;       %信号1频率为200Hz
f2=800;       %信号2频率为800Hz
Fs=2000;      %采样频率为2KHz
N=12;         %量化位数
%Pn=Pn0*Fs/2; %噪声信号功率
%width=0.5;   %函数SAWTOOTH()的尺度参数为0.5
%duty=50;     %函数SQUQRE()的尺度参数为50
%产生信号
t=0:1/Fs:1;
c1=2*pi*f1*t;
c2=2*pi*f2*t;
%sq=square(c,duty);%产生方波
%tr=sawtooth(c,width);%产生三角波
s1=sin(c1);%产生正弦波
s2=sin(c2);%产生正弦波
s=s1+s2;   %产生两个单载波合成后的信号
%产生随机序列信号
noise=randn(1,length(t));%产生高斯白噪声序列

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

%12比特量化
Q_noise=round(noise*(2^(N-1)-1));
Q_s=round(s*(2^(N-1)-1));

%调用自已设计的滤波器函数对信号进行滤波
hn=E4_7_Fir8Serial;
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:\Data\Matlab\My Programs\FPGA\E4_7_Int_noise.txt','w');
fprintf(fid,'%8d\r\n',Q_noise); %高斯白噪声
fprintf(fid,';'); 
fclose(fid);

fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Int_s.txt','w');
fprintf(fid,'%8d\r\n',Q_s); %合成信号
fprintf(fid,';'); 
fclose(fid);

%将生成的数据以二进制数据格式写入txt文件中
%噪声信号转化
fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Bin_noise.txt','w');
for i=1:length(Q_noise)
    B_noise=dec2bin(Q_noise(i)+(Q_noise(i)<0)*2^N,N)
    for j=1:N
       if B_noise(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end
    fprintf(fid,'\r\n');
end
fprintf(fid,';'); 
fclose(fid);

%合成信号转化
fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Bin_s.txt','w');
for i=1:length(Q_s)
    B_s=dec2bin(Q_s(i)+(Q_s(i)<0)*2^N,N)
    for j=1:N
       if B_s(j)=='1'
           tb=1;
       else
           tb=0;
       end
       fprintf(fid,'%d',tb);  
    end
    fprintf(fid,'\r\n');
end
fprintf(fid,';'); 
fclose(fid);

第三步、采用Verilog HDL 语音设计串行结构的FIR 滤波器。

//这是FirFullSerial.v文件的程序清单
module FirFullSerial(
	rst,clk,Xin,
	Yout);
	
	input		rst;   //复位信号,高电平有效
	input		clk;   //FPGA系统时钟,频率为16kHz
	input	 signed [11:0]	Xin;  //数据输入频率为2khZ
	output signed [28:0]	Yout; //滤波后的输出数据


	//实例化有符号数乘法器IP核mult
   reg  signed [11:0] coe;   //滤波器为12比特量化数据
	wire signed [12:0] add_s; //输入为12比特量化数据,两个对称系数相加需要13比特存储
	wire signed [24:0] Mout;  
	mult	Umult (
		.clock (clk),
		.dataa (coe),
		.datab (add_s),
		.result (Mout));

	//实例化有符号数加法器IP核,对输入数据进行1位符号位扩展,输出结果为13比特数据
	reg signed [12:0] add_a;
	reg signed [12:0] add_b;
	adder Uadder (
		.dataa (add_a),
		.datab (add_b),
		.result (add_s));	
		
	//3位计数器,计数周期为8,为输入数据速率(1/8分频器)
	reg [2:0] count;
	always @(posedge clk or posedge rst)
		if (rst)
			count = 3'd0;
		else
			count = count + 1;
	
	//将数据存入移位寄存器Xin_Reg中
	/*reg[7:0]my_memory[0:255];
		其中[7:0]是内存的宽度,而[0:255]则是内存的深度(也就是有多少存储单元),
		其中宽度为8位,深度为256。地址0对应着数组中的0存储单元。
	*/
	reg [11:0] Xin_Reg[15:0];
	reg [3:0] i,j; 
	always @(posedge clk or posedge rst)
		if (rst)
			//初始化寄存器值为0
			begin 
				for (i=0; i<15; i=i+1)
					Xin_Reg[i]=12'd0;
			end
		else
			begin
				if (count==7)
					begin
						for (j=0; j<15; j=j+1)
							Xin_Reg[j+1] <= Xin_Reg[j];
						Xin_Reg[0] <= Xin;
					end
			end
			
	//将对称系数的输入数据相加,同时将对应的滤波器系数送入乘法器
	//需要注意的是,下面程序只使用了一个加法器及一个乘法器资源
	//以8倍数据速率调用乘法器IP核,由于滤波器长度为16,系数具有对称性,故可在一个数据
	//周期内完成所有8个滤波器系数与数据的乘法运算
	//为了保证加法运算不溢出,输入输出数据均扩展为13比特。
	always @(posedge clk or posedge rst)
		if (rst)
			begin
				add_a <= 13'd0;
				add_b <= 13'd0;
				coe <= 12'd0;
			end
		else
			begin
				if (count==3'd0)
					begin
						add_a <= {Xin_Reg[0][11],Xin_Reg[0]};
						add_b <= {Xin_Reg[15][11],Xin_Reg[15]};
						coe <= 12'h000;//c0
					end
				else if (count==3'd1)
					begin
						add_a <= {Xin_Reg[1][11],Xin_Reg[1]};
						add_b <= {Xin_Reg[14][11],Xin_Reg[14]};					
						coe <= 12'hffd; //c1
					end
				else if (count==3'd2)
					begin
						add_a <= {Xin_Reg[2][11],Xin_Reg[2]};
						add_b <= {Xin_Reg[13][11],Xin_Reg[13]};						
						coe <= 12'h00f; //c2
					end
				else if (count==3'd3)
					begin
						add_a <= {Xin_Reg[3][11],Xin_Reg[3]};
						add_b <= {Xin_Reg[12][11],Xin_Reg[12]};
						coe <= 12'h02e; //c3
					end
				else if (count==3'd4)
					begin
						add_a <= {Xin_Reg[4][11],Xin_Reg[4]};
						add_b <= {Xin_Reg[11][11],Xin_Reg[11]};						
						coe <= 12'hf8b; //c4
					end
				else if (count==3'd5)
					begin
						add_a <= {Xin_Reg[5][11],Xin_Reg[5]};
						add_b <= {Xin_Reg[10][11],Xin_Reg[10]};				
						coe <= 12'hef9; //c5
					end					
				else if (count==3'd6)
					begin
						add_a <= {Xin_Reg[6][11],Xin_Reg[6]};
						add_b <= {Xin_Reg[9][11],Xin_Reg[9]};						
						coe <= 12'h24e; //c6
					end
				else
					begin
						add_a <= {Xin_Reg[7][11],Xin_Reg[7]};
						add_b <= {Xin_Reg[8][11],Xin_Reg[8]};						
						coe <= 12'h7ff; //c7
					end
			end

	//对滤波器系数与输入数据的乘法结果进行累加,并输出滤波后的数据
	//考虑到乘法器及累加器的延时,需要计数器为2时对累加器清零,同时输出滤波器结果数据。
	//类似的时延长度一方面可通过精确计算获取,但更好的方法是通过行为仿真查看
	reg signed [28:0] sum;
	reg signed [28:0] yout;
	always @(posedge clk or posedge rst)
		if (rst)
			begin 
				sum = 29'd0; 
				yout <= 29'd0;
			end
		else
			begin
				if (count==2)
					begin
						yout <= sum;
						sum = 29'd0;
						sum =sum + Mout;
					end
				else
				   sum = sum + Mout;
			end
	
	assign Yout = yout;
			
endmodule

第四步、编写Verilog HDL测试激励文件

// Copyright (C) 1991-2012 Altera Corporation
// Your use of Altera Corporation's design tools, logic functions 
// and other software and tools, and its AMPP partner logic 
// functions, and any output files from any of the foregoing 
// (including device programming or simulation files), and any 
// associated documentation or information are expressly subject 
// to the terms and conditions of the Altera Program License 
// Subscription Agreement, Altera MegaCore Function License 
// Agreement, or other applicable license agreement, including, 
// without limitation, that your use is for the sole purpose of 
// programming logic devices manufactured by Altera and sold by 
// Altera or its authorized distributors.  Please refer to the 
// applicable agreement for further details.

// *****************************************************************************
// This file contains a Verilog test bench template that is freely editable to  
// suit user's needs .Comments are provided in each section to help the user    
// fill out necessary details.                                                  
// *****************************************************************************
// Generated on "05/24/2014 22:37:36"
                                                                                
// Verilog Test Bench template for design : FirFullSerial
// 
// Simulation tool : ModelSim-Altera (Verilog)
// 

`timescale 1 ns/ 1 ns //设置仿真时间单位:ns
module FirFullSerial_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers
reg [11:0] Xin;
reg clk;
reg rst;
reg clk_data; //数据时钟,速率为系统时钟clk的1/8;
// wires                                               
wire [28:0]  Yout;

// assign statements (if any)                          
FirFullSerial i1 (
// port map - connection between master ports and signals/registers   
	.Xin(Xin),
	.Yout(Yout),
	.clk(clk),
	.rst(rst)
);

parameter clk_period=625; //设置时钟信号周期(频率):1.6MHz
parameter clk_period_data=clk_period*8;
parameter clk_half_period=clk_period/2;
parameter clk_half_period_data=clk_half_period*8;
parameter data_num=2000;  //仿真数据长度
parameter time_sim=data_num*clk_period; //仿真时间

initial
begin
	//设置时钟信号初值
	clk=1;
	clk_data=1;
	//设置复位信号
	rst=1;
	#1000 rst=0;
	//设置仿真时间
	#time_sim $finish;
	//设置输入信号初值
	Xin=12'd10;
end

//产生时钟信号
always                                                 
	#clk_half_period clk=~clk;
always
	#clk_half_period_data clk_data=~clk_data;

//从外部TX文件(SinIn.txt)读入数据作为测试激励
integer Pattern;
reg [11:0] stimulus[1:data_num];
initial
begin
   //文件必须放置在"工程目录\simulation\modelsim"路径下
	//$readmemb("E4_7_Bin_noise.txt",stimulus);
	$readmemb("E4_7_Bin_s.txt",stimulus);
	Pattern=0;
	repeat(data_num)
		begin
			Pattern=Pattern+1;
			Xin=stimulus[Pattern];
			#clk_period_data;//数据周期为时钟周期的8倍
		end
end


//将仿真数据dout写入外部TXT文件中(out.txt)
integer file_out;
initial 
begin
   //文件放置在"工程目录\simulation\modelsim"路径下                                                  
	//file_out = $fopen("E4_7_Noiseout.txt");
	file_out = $fopen("E4_7_Sout.txt");
	if(!file_out)
		begin
			$display("could not open file!");
			$finish;
		end
end
wire rst_write;
wire signed [28:0] dout_s;
assign dout_s = Yout;                //将dout转换成有符号数据
assign rst_write = clk_data & (!rst);//产生写入时钟信号,复位状态时不写入数据
always @(posedge rst_write )
	$fdisplay(file_out,"%d",dout_s);
	
endmodule

第五步、运行ModelSim 仿真软件对FPGA 程序进行功能仿真及时序仿真,仿真程序自动将仿真结果数据存放在测试激励文件指定的文本文件中。 

第六步、编写MATLAB程序,从ModelSim 仿真软件生成的文本文件中读取滤波器输出数据,对数据进行时域及频域分析,查看FPGA 实现是否满足设计要求。

%E4_7_NoiseAndCarrierOut.M
f1=200;       %信号1频率为200Hz
f2=800;       %信号2频率为800Hz
Fs=2000;      %采样频率为2KHz
N=12;         %量化位数


%从文本文件中读取数据
%测试输入数据分别放在Noise_in和S_in变量中
fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Int_noise.txt','r');

[Noise_in,N_n]=fscanf(fid,'%lg',inf);
fclose(fid);
fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Int_s.txt','r');

[S_in,S_n]=fscanf(fid,'%lg',inf);
fclose(fid);
%滤波后的输出结果数据分别放在Noise_out和S_out变量中
fid=fopen('D:\Data\Matlab\My Programs\FPGA\E4_7_Noiseout.txt','r');

[Noise_out,N_count]=fscanf(fid,'%lg',inf);
fclose(fid);
fid=fopen('D:\Data\Matlab\My Programs\FPGA\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);
%滤波器本身的幅频响应
hn=E4_7_Fir8Serial;
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;

%绘制时域波形
%设置显示数据范围
t=0:1/Fs:50/Fs;t=t*1000; 
t_in_noise=Noise_in(1:length(t));
t_in_s=S_in(1:length(t));
t_out_noise=Noise_out(1:length(t));
t_out_s=S_out(1:length(t));
figure(2);
subplot(211);
plot(t,t_in_noise,'--',t,t_out_noise,'-');
xlabel('时间(ms)');ylabel('幅度');title('FPGA仿真白噪声信号滤波前后的时域波形');
legend('输入信号波形','输出信号波形');
grid;
subplot(212);
plot(t,t_in_s,'--',t,t_out_s,'-');
xlabel('时间(ms)');ylabel('幅度');title('FPGA仿真合成单频信号滤波前后的时域波形');
legend('输入信号波形','输出信号波形');
grid;

第七步、分析数据

 

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheeky_man

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值