原创 MATLAB信号处理仿真-插值FIR滤波器

2012-10-9 22:47 14001 21 36 分类: 处理器与DSP 文集: MATLAB信号处理仿真


上篇文字里面,我们说到了FIR滤波器,接下来我们在此处讨论一下插值滤波。

这个话题属于多速率信号处理的范畴,经典的参考读物有杨小牛老师的《软件无线电原理与应用》以及 Fredric J. Harris 所著的 《通信系统中的多采样率信号处理》,这两位都是通信行业中的大腕,前者曾是中电科36所的所长,这个所在嘉兴,是国内电子对抗领域的翘楚。后面一位更加厉害,高通公司用他的名字在圣迭戈州立大学设立了一个奖学金。

数字上、下变频是软件无线电领域里面非常重要的一个分支,以数字上变频来说,关键技术就是插值滤波和DDS技术。插值滤波技术,也叫做上采样,或采样率提升,为什么这个技术很重要呢,请自行搜索“软件无线电 插值滤波器”。

根据小牛老师的书,信号N倍插值之后的频谱会出现N个镜像。于是呢,需要用滤波器来把镜像频率除去,插值滤波器常用的有2个系列,FIR和CIC,其中FIR主要用于小倍率的插值,而CIC则用于大倍率的插值,比如说,参照以下ADI的经典芯片 AD9857,里面用FIR做了4倍插值,用CIC做2-63倍插值,这是因为FIR需要进行大量乘加,但是滤波性能好,而CIC不用乘法,但是只能抑制镜像频率附近的信号频带,并且CIC的通带内衰减较快,所以CIC适合用在高采样率的一端,关于CIC先不多说,此处专注FIR系列。

贴一张小牛老师书里面的插图
20121002225153632.jpg




多速率FIR滤波器有两种说法,半带滤波器(halfband filter)和多相滤波器,半带其实也是多相的一个特例,区别在于,如果进行2的N次幂的插值,我们通常用半带,因为乘法数量可以降为原来的1/4,而对于非基2的插值,我们就得用多相结构了。无论是半带还是多相,其实都是一种对原型滤波器的优化。噢,原型滤波器,对了,为了设计最终使用的滤波器,我们首先要有一个原型滤波器,然后根据这个原型滤波器再设计半带或是多相结构的滤波器,详情请自行拜读小牛爷爷的书吧,祖师爷的书最好还是买一本算是交了保护费嘛。

此处的仿真过程大致如下,首先,生成一个多音正弦,然后进行补零的插值,然后把补零插值的信号塞到一个低通滤波器里面,这样就有三个版本的信号,原始信号,补零插值信号,以及插值滤波之后的信号。注意此仿真的计算过程是概念上的理论模型,实际干活中不会这么做的,因为进入滤波器的数据里面包含的大量的0数据,把这种数据拿去做乘法是个非常亏本的事情,所以才会有半带啊,多相啊这种优化,嗯,不再赘述了,先看图吧,另外,吐槽一下,EDN网站啊,你是我们码农电工的乐园,尽管杂志是免费送的,网站是免费看到,博客是免费写的,您就不能支持一下清楚一点的图片么,您瞧我这几张时域频域信号图片寒碜的,我自己都觉得难受,实在不成您办个募捐,俺们捐点款给您买带宽买磁盘阵列也成啊。

三个版本信号的时域图
20121002225224621.jpg

滤波器频响
20121002225349275.jpg
原始信号频谱
20121002225552728.jpg
补零插值信号频谱
20121002225625644.jpg
插值滤波信号频谱
20121002230207685.jpg


OK,上代码,请自行修改参数绘图,祝玩得开心

%///////////////////////////////////////////////////////////
% FILE: test1.m
% Simulation  of FIR interpolation
%///////////////////////////////////////////////////////////
close all;
clear    ;
clc      ;

% specify input multi-tone sine component frequency
sin_freq    = [1:3]*20E3;

data_len    = 2048  ;% signal data length
fs          = 600E3 ;% sample rate
quant_bits  = 12    ;% signal quant bits
kaiser_beta = 8     ;% beta of kaiser win
n_itp       = 3     ;% num of interpolation

x_max_1x    = 30    ;% 1x signal time plot  x axis max value
n_coef      = 32    ;% number of coefficents

f     = [0, 0.2, 0.2, 1]    ;
m     = [1, 1  , 0  , 0]    ;
coeff = fir2(n_coef-1, f, m);
% draw the filter reponse curve
freqz(coeff);

x_max_itp   = x_max_1x * n_itp ;
fs_itp      = fs * n_itp       ;

% itp for abv of 'interpolation'
data_len_itp= data_len * n_itp ;

% generate original signal
signal_1x   = gen_quant_multi_sin(fs, sin_freq, data_len, quant_bits);
% create zero filling interpolation signal
signal_itp  = zeros(data_len_itp,1);
% write the original signal value into itp signal
signal_itp(1:n_itp:data_len_itp-n_itp+1) = signal_1x;

data_conv  = conv(coeff, signal_itp);
filter_out = data_conv(1:data_len_itp);


figure;
subplot(3,1,1);stem(signal_1x , 'MarkerSize', 1.5); xlim([1 x_max_1x]);
tt_str = 'Signal 1x';
title(tt_str , 'fontsize', 14);

subplot(3,1,2);stem(signal_itp, 'MarkerSize', 1.5);xlim([1 x_max_itp]);
tt_str = strcat('Signal Itp ', num2str(n_itp), 'x');
title(tt_str, 'fontsize', 14);

subplot(3,1,3);stem(filter_out, 'MarkerSize', 1.5);xlim([1 x_max_itp]);
tt_str = 'Filter Out';
title(tt_str, 'fontsize', 14);

kaiser_win_spectrum_plot(fs, signal_1x, kaiser_beta);
ylim([-160,10])     ;   % set y-axis range       
title('signal 1x, Normalized Spectrum', 'fontsize', 14);

kaiser_win_spectrum_plot(fs_itp, signal_itp, kaiser_beta);
ylim([-160,10])     ;   % set y-axis range       
title('Zero Interpolation, Normalized Spectrum', 'fontsize', 14);

kaiser_win_spectrum_plot(fs_itp, filter_out, kaiser_beta);
ylim([-160,10])     ;   % set y-axis range       
title('Filter Out, Normalized Spectrum','fontsize', 14);



 

PARTNER CONTENT

文章评论15条评论)

登录后参与讨论

用户1028808 2015-3-12 00:12

辛苦版主做科普

用户251294 2014-11-3 13:43

学习了~~!

用户1762371 2014-5-28 11:37

解释的很详细,通俗易懂,博主辛苦了。。。 很受用,真诚感谢分享。。。

用户411818 2013-10-29 20:37

牛逼

用户449783 2013-6-14 11:24

大师级别,尝试了一下代码,很漂亮

用户433222 2013-4-22 22:06

小杜老师加油,多写些资料供我们参考。

用户403664 2013-1-7 15:07

不知道现在还有没有这个问题?发送站内消息OK不?

用户435114 2012-12-13 23:32

正在学习,受教了,多谢楼主

用户424825 2012-10-12 14:23

报告版大,目前网站无法回复消息和发消息,写好标题和内容,点击发送,系统报错,红字“指定的用户名不存在。 ” 在FireFox 10 和 IE9 下面都是如此 俺比较古董,目前围脖不怎么用的说。 另,能否把博客首页上面的“MATLAB信号处理仿真”专栏的图片换成这张呢。 http://bbs.ednchina.com/images/attachments/201210/20121009214432814.jpg 这张比较水灵儿

用户424825 2012-10-12 09:09

I am so honored to have this opportunity
相关推荐阅读
用户424825 2013-12-04 21:13
嵌入式环境下的算法开发之学习建议
         说到在嵌入式Linux的平台上设计算法,目的无非是2个,一是Linux,这东西无孔不入,可以塞到各种板子上。二是算法代码执行的效率,嵌入式的平台不像是PC各种资源还是比较紧张...
用户424825 2013-10-27 15:56
博客测试记录
根据EDN的网页温馨提示,添加了Host DNS的信息,可以从学校访问了,哈利路亚,党的光芒暖人心 可以从传媒大学校内访问,2013年4月22日,于实验室 无法从传媒大学校内访问,2013...
用户424825 2013-10-06 18:34
博客页面测试
博客测试 插图测试     不管怎么说,EDN的博客是越做越好,而且编辑器的功能也日益强大。 edn的确是用心在做这个事情了,打从两年前网站重新改版了一次之后,折腾的有点乱,现在似乎是又变得好起...
用户424825 2013-08-20 09:56
高性能高频收发机设计:业余无线电爱好者的福音
之前在EDN上发表过的文章《21世纪的业余无线电》引起了人们诸多的兴趣,人们对这个业余爱好的各个方面也提出了许多问题。本文撰写的动机也是源于这方面的兴趣,但不只限于业余无线电。本文讨论了工程师在设计各...
用户424825 2013-08-15 09:04
评论:@用芯创造未来 博客中提到的“【博客大赛】心得分享”
此文有深意,收藏之 ---------------- 这段时间经历太多踏入职场的第一次,第一次引荐别人,也第一次经历被引荐的人离开,第一 次与上层深入探讨行业发展并交互多重信息,第一次考博...
用户424825 2013-08-14 06:55
EDN 好文记录帖
  “高性能高频收发机设计:业余无线电爱好者的福音 ”。 介绍接收机体系结构的文章,其中末尾部分对于80MHz,14比特带通直采 与 传统混频方案的噪声对比分析比较精彩。值得收藏   ...
我要评论
15
21
关闭 站长推荐上一条 /3 下一条