插值滤波相关文档(含matlab代码)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

上篇文字里面,我们说到了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系列。

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

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

牛爷爷的书吧,祖师爷的书最好还是买一本算是交了保护费嘛。

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

三个版本信号的时域图

滤波器频响

原始信号频谱

补零插值信号频谱

插值滤波信号频谱

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;

相关文档
最新文档