shopify建站费用,网站html动态效果代码,wordpress打开页面很慢,wordpress ajax login数字滤波器的设计#xff0c;本项目做的数字滤波器准确来说是FIR滤波器。
FIR滤波器#xff08;有限冲激响应滤波器#xff09;#xff0c;与另一种基本类型的数字滤波器——IIR滤波器#xff08;无限冲击响应滤波器#xff09;相对应#xff0c;其实就是将所输入的信号…数字滤波器的设计本项目做的数字滤波器准确来说是FIR滤波器。
FIR滤波器有限冲激响应滤波器与另一种基本类型的数字滤波器——IIR滤波器无限冲击响应滤波器相对应其实就是将所输入的信号都看成是离散的用离散的冲击信号代替实际的信号。对于FIR滤波器而言就是将有限个最近输入的冲击信号进行加权平均运算得到新的输出信号用以滤除其他不需要的信号。而IIR滤波器不仅需要对输入信号进行加权平均对输出信号也要进行加权平均从而得到新的输出信号滤除其他不需要的信号。
FIR滤波器的算法就是类似卷积的算法。核心其实就是加权平均即
Y(n)h(0)*x(n)h(1)*x(n-1)h(2)*x(n-2)h(3)*x(n-3)…… h(N-1)*x(n-N1)
X(n)是我们待滤波的信号h(n)是滤波器系数。
在用Verilog编程之前用MATLAB计算出h(k)(k0~N-1)权重。
对于FPGA而言有两种方法可以实现FIR滤波器的设计一种是通过Verilog语言编写另一种是通过IP核实现。
用Verilog语言编写需要通过Matlab的工具箱生成h(k)(k0~N-1)权重。而用IP核的话直接在软件里生成就行本文是以Quartus软件为例。
本文刚开始还不想用IP核来生成的并介绍了使用Matlab中FDATOOL工具箱的方法然后后面改用了IP核的方式来完成FIR滤波器的设计与仿真。
Fdatool生成FIR相关的系数
打开matlab的fdatool工具箱。 然后选择设计需要的滤波器低通FIR滤波器窗函数设计Window采用布莱克曼窗Blackman99阶这样有100个系数采样频率50MHz通带频率1.5MHz。 按照上图设定参数后在上图中Specify order是阶数Fc是截止频率Fs是序列的采样频率。点击Design Filter。 设计完成了可以看到显示的频率为0~Fs/2的幅频响应大概在2MHz左右幅度下降为原来的-60dB以下也就是正常幅度的千分之一。
由于在FPGA中计算浮点数是一件很麻烦的事情此处就设置成定点数且位数越高越精确这里设置的是16位定点数来量化。 然后点击Apply。下方图片中实线是量化后的虚线是未量化过的精准的。可以看到虽然5MHz之后的阻带衰减不如原来但也可以衰减到-100dB也就是原来的1/100000。这个衰减程度已经足够了。 最后是导出系数。直接通过file——export导出的是没有经过量化的系数通过量化的系数要经过Targets———XILINX Coefficient file导出.coe文件就可以查看量化后的数了。 新建Quartus工程设计FIR滤波器
首先创建好工程这里不再赘述。
然后生成FIR Compiler II 的IP核随意先生成了一个但是好像还不太对。后来才知道应该选用FIR Complier v13.1的FIR IP核。首先进入step1最开始要设置好滤波器系数但是不知道为什么就是导不进去。如果可以导进去的话那么matlab中的fdatool工具箱我们就是用到了但是问题就是导不进去。不过好在点击上面那个floating Coefficient Set可以自动生成浮点数的滤波器系数。 于是我们简单设置以下让IP核自动生成相应的系数。 然后设置一下数据位宽 Step2的内容就全部勾选即可然后进入step3自动生成IP核。
仿真
采用IP核的方式产生的FIR滤波器仿真的话直接通过编辑textbench仿真文件的方式仿真采用Verilog语言编写方式产生的FIR滤波器在编辑textbench仿真文件之前还需对顶层.v文件进行编辑。
首先介绍采用IP核的方式仿真一开始遇到的问题是关于FIR Compliter的IP核没有破解后来需要改一下Licence文件才能使用。如下图所示原来红框中是00A2后来改成FIR Compliter的IP核的ID号然后重启就能正常编译使用了。 然后遇到的问题是待滤波的数据和滤波后的数据分别是怎样输入进去以及怎样输出保存起来的。先做一种尝试待滤波的数据通过Matlab生成并存放在.txt文档中然后在仿真文件里调用该文档的数据不过要注意采样周期和采样数据点的问题也就是时序的问题。输出的数据的话先不用管直接通过仿真看滤波后输出数据的变化即可。
编写Matlab程序产生待滤波信号产生两个信号0.5MHz和5MHz采样频率50MHz,采样5个周期进行16-bit量化并把量化后的数据写到.txt文件中。目前的问题在于怎么转换成16位二进制数。最后还是选择一种比较好的方法。首先判断读取的一个数是否大于零如果大于零直接采用dec2bin函数转换成16位的二进制数如果小于零则用216减去该数的绝对值再用dec2bin函数将其转换成16位的二进制数。主要卡在如何分别读取每一个数上面还是对matlab的操作不太熟悉。不过好在最后还是弄出来了。Matlab相关程序如下图所示。 最终生成的十进制数和二进制数的txt文件内容如下图所示。 然后再学习一下FFT算法利用matlab先对输入的数据进行频谱分析。有两种方法一种是编写程序的方法在MATLAB中FFT的调用函数主要有两个即YFFT(X)和YFFT(X,N)。网上的例子
clf; fs100;N128; %采样频率和数据点数 n0:N-1;tn/fs; %时间序列 x0.5*sin(2*pi*15*t)2*sin(2*pi*40*t); %信号 yfft(x,N); %对信号进行快速Fourier变换 magabs(y); %求得Fourier变换后的振幅 fn*fs/N; %频率序列 subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅 xlabel(频率/Hz); ylabel(振幅);title(N128);grid on;
一种是利用Simulink仿真模型的方法。首先导入数据然后进入Simulink。利用Powergui模块进行FFT分析加上一个Form warkspace和一个示波器就可以了具体就不介绍。 我们只需要知道FFT输入的是按时间来划分的采样点数据经过FFT运算之后得出的是按频率来划分的同样数据长度的数据。 之后我们进入最关键的阶段即仿真阶段。我们只需要导入Matlab生成的待滤波信号然后在仿真软件中观察滤波后的信号即可。
我们先编写好仿真文件。 然后联合Modelsim仿真。右键data_in和data_out设置radix为decimal十进制format为analog。 得到仿真结果可以看到其周期为2000ns即0.5MHz表示5MHz干扰滤除干净了。 本文大部分内容都属于原创如需转载请附上本文网站
如果需要相关的仿真图、程序代码等资料可以直接私信我我会及时回复。