当前位置: 首页 > news >正文

网站建设时间计划seo优化人员

网站建设时间计划,seo优化人员,在阿里巴巴上怎样做网站,成都科技网站建设找哪家前言:复习大学课程中数字信号处理的内容,尽管学了很多理论知识,但与实际的联系还是比较少,也就是说学到的知识不能很好地运用于实践,所以我打算对理论知识进行验证,从MATLAB和FPGA入手,完成滤波…

前言:复习大学课程中数字信号处理的内容,尽管学了很多理论知识,但与实际的联系还是比较少,也就是说学到的知识不能很好地运用于实践,所以我打算对理论知识进行验证,从MATLAB和FPGA入手,完成滤波器的设计,体会模拟信号数字处理的过程,同时也对这个过程进行记录,方便回顾和完善。

设计一个FIR带通滤波器,截止频率为2400Hz和3600Hz,阻带最小衰减20dB以上,测试信号为1K、2K、3K、4K、5Khz的混频信号,要求3KHz信号顺利通过而过滤其他频率信号。

思路:

1、设计该滤波器,采样频率应该为信号最高频率的2倍以上,我设计的采样频率为40khz,采用凯赛窗设计FIR带通滤波器,通过matlab仿真得到该滤波器的幅频响应:

该滤波器在2KHz处的衰减将近60dB,在1K、4K、5KHz处的衰减也达到了40dB,基本符合设计要求,但为了达到这样的效果,该滤波器的长度被我增加到了64(阶数为63),故它的成本较高。

Matlab代码如下:

fs = 40*10^3;
N = 64;   
window = kaiser(N)';
fp = [2400*2/fs 3600*2/fs];
b = fir1(N-1,fp,'bandpass',window);

2、使用FPGA产生测试信号,使用quartus Ⅱ软件的NCO ip核可以产生不同频率的正弦波信号,下面以1KHz正弦波为例:

相位累加器为32位宽,角度分辨率位宽16位,幅度位宽10位,输入时钟为板载时钟50M,输出1KHz的正弦信号,完成配置后生成ip核,实例化后产生1Khz的正弦波信号,代码如下:

wire signed [9:0]   sin_1k;
nco      nco_inst1
(.out_valid(),.fsin_o(sin_1k),.phi_inc_i(32'd85_899),.reset_n(1'b1),.clken(1'b1),.clk(sys_clk)
);

生成的波形如下:

3、verilog代码中采用全串行结构设计FIR滤波器,由于matlab设计出的FIR滤波器一定是线性相位结构,并且具有对称性,故可采用以下结构图设计滤波器:

采样率为40KHz,故数据输入频率为40KHz,则滤波器时钟CLK为1.28MHz,该时钟可通过由PLL ip核产生。由于滤波器系数的对称性,故只需要对32个滤波器系数与输入数据进行累加乘运算就可以实现滤波功能

y(n) = \sum_{N-1}^{m=0}h(m)x(n-m)

          = h(0)[x(n)+x(n-63)]+h(1)[x(n-1)+x(n-62)]+...+h(31)[x(n-31)+x(n-32)]

为了实现该算法,首先需要生成一个乘法器ip核,完成乘法运算,配置如下:

该乘法器输入位宽分别为14bit和12bit,并且为有符号型,例化该乘法器,将加和数据与滤波器系数输入,获得一次乘法输出,代码如下:

mult mult_inst
(.clock ( clk ),.dataa (dataa),.datab ( datab ),.result ( Mout )
);

结构图所示的是一个15阶的全串行FIR滤波器结构,而我设计的滤波器为63阶,虽然阶数不同,但核心的算法相同。由于数据输入频率为40KHz,故滤波器时钟频率应该为40KHz * 32 = 1.28MHz,这样才能保证在输入一个新数据前,完成32次乘运算,也就是输出一个y(n)。具体算法如下:

首先,产生一个周期为32的计数器count,每一个CLK上升沿到来,count自增1,故每当count归0,相当于时间经过了40KHz。

verilog代码如下:

reg [4:0]    count; 
always@(posedge clk or negedge sys_rst)if(sys_rst == 1'b0)count <= 5'd0;elsecount <= count + 1'b1;

然后,将新输入的数据保存到寄存器中,这里采用了移位寄存器,保存64个对称的数据,verilog代码如下:

reg signed [12:0]  xin_reg[0:63];
reg [5:0]i,j;
always@(posedge clk or negedge sys_rst)if(sys_rst == 1'b0)beginfor(i=0;i<63;i=i+1)xin_reg[i] <= 13'd0;endelsebeginif(count == 5'd31)beginfor(j=0;j<63;j=j+1)xin_reg[j+1] <= xin_reg[j];xin_reg[0]  <= xin;endend

这里定义了64给个有符号的13位寄存器,分别存储输入的数据。

接着,完成两个对称数据相加,例如:x(n)+x(n-63),… ,并且将其结果送入乘法器,同时乘法器另一个乘数端口送入对应的滤波器系数,例如h(0),… ,由于代码过长,这里只展示部分,其他同理,verilog代码如下:

always@(posedge clk or negedge sys_rst)if(sys_rst == 1'b0)beginadda <= 13'd0;addb <= 13'd0;datab <= 12'd0;endelsebeginif(count == 5'd0)beginadda <= {xin_reg[0][12],xin_reg[0]};addb <= {xin_reg[63][12],xin_reg[63]};datab <= -12'd74;end………endassign dataa = adda + addb;

至此,完成了一次乘法器的输出,而滤波器的输出是由32个类似的输出累加得到,由于乘法器的输入位宽分别为14bit和12bit,故输出位宽为26bit,对32个输出累加的话,需要扩展5位,故滤波器输出为31bit的有符号数,verilog代码如下:

reg signed [30:0]  sum;
reg signed [30:0]  Yout;
always@(posedge clk or negedge sys_rst)if(sys_rst == 1'b0)beginsum <= 31'd0;Yout <= 31'd0;endelseif(count == 5'd2)beginYout <= sum;sum <= Mout;endelsesum <= sum + Mout;assign out = Yout;

需要说明的是,因为在count == 0时,给两个加数赋值和给滤波器系数赋值,而真正获得新的数据是在count == 1时,故在count == 1时将两个乘数送入乘法器,而我配置的乘法器有一级流水线,所以乘法器输出在count == 2的时候,通过以上分析,可以明白为什么在count == 2时才会将乘法器输出Mout送给sum,而其他时刻是进行累加运算,至于何时将累加和送给输出呢?同理,由于count的周期为32,所以从count == 2 到count == 31 到 count == 0 ,再到count == 1,刚好完成一个周期,也就是32次累加乘运算,所以在count == 2时(注意D触发器的延时,当count == 2时,此时的sum为count == 1时的sum加上count == 1时的Mout,所以仍然是32个数据的求和,而不是33个数据之和),将滤波数据送出,应该特别注意上面括号中的分析,可以对比波形理解触发器的延时特性。

最后,编写板载测试文件,将滤波器的输出(有符号的31位数据)转换为DA模块的8位无符号DA数据,然后将DA模块时钟和8位数据送到模块中,完成板载输出测试,verilog代码如下:

module boardtst
(input wire                   sys_clk             ,input wire                   sys_rst             ,output wire [7:0]            DA                  ,output wire                  DA_clk                  
);wire signed [30:0] yout;
fullserial_filter u3
(.clk         (clk_1p28M)   ,.sys_rst     (sys_rst)     ,.xin         (sin_wave)    ,          .out         (yout)             
);
assign DA = yout[30:23] + 8'd128;
assign DA_clk = sys_clk;

这里要注意的是有符号数据如何转化成无符号数据,因为滤波器输出为31位的有符号输出,而DA模块接收的是8位的无符号型,故应该截取高8位,这相当于将数据右移了23位,然后再加上128,于是完成有符号到无符号的转换。

下面是测试信号与滤波后的信号:

测试信号:

 

滤波后输出信号:

可以看到,虽然将3KHz的信号分离了出来,但波形并不平滑,这是由于采样速率和转换频率较低造成的。

需要补充的是,滤波器系数的量化位宽会影响到滤波器的性能,通过matlab仿真观察:

可以看出,与未量化相比,8bit量化已经很好地满足了滤波器的性能要求,故使用FPGA设计该滤波器时,将乘法器的输入设置成14bit与8bit就已经足够了。

Matlab代码如下:

b8 = round(b/max(abs(b))*(2^7-1));
b12 = round(b/max(abs(b))*(2^11-1));
b14 = round(b/max(abs(b))*(2^13-1));pm = 20*log10(abs(fft(b,1024)));pm = pm - max(pm);
pm8 = 20*log10(abs(fft(b8,1024)));pm8 = pm8 - max(pm8);
pm12=20*log10(abs(fft(b12,1024)));pm12=pm12-max(pm12;
pm14=20*log10(abs(fft(b14,1024)));pm14=pm14-max(pm14;x_f = [0:fs/length(pm):fs/2];mfpm = pm(1:length(x_f));
mfpm8 = pm8(1:length(x_f));
mfpm12 = pm12(1:length(x_f));
mfpm14 = pm14(1:length(x_f));plot(x_f,mfpm,'-',x_f,mfpm8,'.-',x_f,mfpm12,'x',x_f,mfpm14,'--');
xlabel('hz');ylabel('db');
legend('未量化','8比特量化','12比特量化','14比特量化');
grid;

至此,完成了设计目标,但该实验仍有很多不足,敬请大家批评指正!

参考文献:

[1] 夏宇闻.Verilog数字系统设计教程(第三版).北京:北京航空航天大学出版社,2013

[2] 杜勇.数字滤波器的MATLAB与FPGA实现——Altera/Verilog版(第二版).北京:电子工业出版社,2019

http://www.jinmujx.cn/news/109197.html

相关文章:

  • 做彩票网站代理犯法吗6怎么做推广和宣传
  • 企业 网站备案百度广告推广价格
  • 做网站的那些个人工作室微信推广软件有哪些
  • 哪些企业需要网站建设网站免费推广网站
  • 做问卷赚钱网站比较好的网站建设网站
  • 本地的南通网站建设优化 保证排名
  • 株洲做网站的公司今日新闻头条新闻最新
  • 房屋中介网站怎么做竞价推广出价多少合适
  • C2C电子商务网站管理系统成人英语培训
  • android app开发教程网站seo优化分析
  • 沈阳沈河区网站建设最新提升关键词排名软件
  • 永久免费网站申请注册怎么联系百度推广
  • 房地产网站制作教程千峰培训可靠吗?
  • 国产 做 视频网站小程序搭建教程
  • 做网站先做ue乐陵seo外包公司
  • 门户网站功能百度快照入口
  • 网站开发干嘛百度信息流广告投放
  • 食品经营许可网站增项怎么做长沙快速排名优化
  • 营口做网站多少钱广告推广文案
  • 成都b2b网站建设重庆seo关键词优化服务
  • 黑马程序员和比特就业课佛山做seo推广公司
  • 做国际网站花钱吗品牌广告语经典100条
  • 互联网营销中心seo
  • 网页的动态效果百度seo是啥意思
  • behance设计网站推荐杭州百度人工优化
  • 网站设计的目的百度企业查询
  • 网站建设策划 流程图微信crm系统
  • 类似于pinterest的设计网站网络推广公司运营
  • 广州市花都区网站建设公司优秀的网络搜索引擎营销案例
  • 张家港优化网站seoseo研究中心好客站