CIC滤波器设计

CIC滤波器设计,第1张

CIC滤波器实现简单,资源消耗少(只需要加法器),成为变采样率系统中比较常用的滤波器,但也需要在合适的场景中使用,不然对信号质量会造成较大影响。

我们可以通过matlab的filter designer了解CIC滤波器的各种特性。通过图1和图2找到CIC滤波器设计窗口。

从幅频曲线中容易得出CIC滤器器通带平台性差,过渡带宽,带外抑制性能起伏较大。

带外抑制性能可以通过增加CIC级数(Number Of Sections)来提升,但这会对通带平坦性带来负面影响,具体设计CIC时需要折中该参数。

通常在C语言实现CIC时,可以将该参数设计为偶数,这样会使拖尾是一个整数,方便去掉数据首尾的无效值。更进一步,设计为2,4,8时,归一化可以直接通过移位实现。

当我们使用CIC时,需要保证 有用信号的fmax应足够小于fs/2/Mcic ,其中Mcic为内插倍数。这样才能保证在有效带宽内足够的平坦度,一般fmax相对于直流衰减不能超过05dB

所以在变速率系统中,CIC一般作为最后数字滤波器的前端(靠近模拟域),如上采样系统中信号先经过限带成型滤波器(低通FIR),HB滤器组,最后经过CIC到DAC速率。

下图为8倍上采样的图示。

需要注意的是为了保证CIC前后信号时域采样点平均功率的一致性,在第一级CIC滤波器中没有做归一化,这部分增益正好可以补偿上采样插0带来采样点功率的损失。后续每一级都要做归一化,防止溢出。

clear;clc;close all;

%% load data symbols from RRC out,make sure fmax << fs/2/Mcic

load('zeroDataFilterOutmat')  % 8x oversampling signal

symbPower = funCountPower(zeroDataFilterOut); % Power before filter

%% CIC filter for interpolate 8 times

Mcic = 8;

coefCic = ones(Mcic,1);

N = 4;      % number of CIC section

modDataZero8x = upsample(zeroDataFilterOut,Mcic);

txPower = funCountPower(modDataZero8x); % Power after zero insertion

%% filter

dataFilterTemp = conv(modDataZero8x,coefCic);  % First CIC section

for i = 1:N-1

    dataFilterTemp = conv(dataFilterTemp,coefCic)/Mcic;

end

tailLen = N(Mcic-1)/2;

dataOut = dataFilterTemp(tailLen+1:end-tailLen);

outPower = funCountPower(dataOut);  % Power after filter

C语言没有这个函数

MATLAB中有这个函数

说明

巴特沃斯滤波器设计

语法

[z,p,k]=butter(n,Wn)

[z,p,k] = butter(n,Wn,'ftype')

[b,a]=butter(n,Wn)

[b,a]=butter(n,Wn,'ftype')

[A,B,C,D]=butter(n,Wn)

[A,B,C,D] = butter(n,Wn,'ftype')

[z,p,k]=butter(n,Wn,'s')

[z,p,k] = butter(n,Wn,'ftype','s')

[b,a]=butter(n,Wn,'s')

[b,a]=butter(n,Wn,'ftype','s')

[A,B,C,D]=butter(n,Wn,'s')

[A,B,C,D] = butter(n,Wn,'ftype','s')

描述

butter 用来设计低通、带通、高通、和带阻数字和模拟的巴特沃斯滤波器。巴特沃斯滤波器的特征是通带内幅度响应最大平坦,且整体上是单调的。

巴特沃斯滤波器牺牲了在通带和阻带内的单调衰减陡度。除非需要巴特沃斯滤波器的平滑性,椭圆或切比雪夫滤波器可以用更小的滤波器阶数获得更陡峭的衰减特性。

数字域

[z,p,k] = butter(n,Wn) 设计一个阶数为n,归一化截止频率为Wn的低通数字巴特沃斯滤波器。此函数用n列的向量z和p返回零点和极点,以及用标量k返回增益。

[z,p,k] = butter(n,Wn,'ftype') 设计一个高通、低通或带阻滤波器,字符串'ftype'取值是:

'high' 用于设计归一化截止频率为Wn的高通数字滤波器

'low' 用于设计归一化截止频率为Wn的低通数字滤波器

'stop' 用于设计阶数为2n的带阻数字滤波器,Wn应该是有两个元素的向量Wn=[w1 w2]。阻带是w1 < ω <w2

截止频率 是幅度响应为处的的频率。对巴特沃斯滤波器,归一化截止频率Wn必须是介于0和1之间的数,这里的1对应于尼奎斯特频率,即每秒π弧度(π rad/s)。

如果Wn是含有两个元素的向量,Wn=[w1 w2],butter 返回阶数为 2n的数字带通滤波器,通频带为w1 < ω <w2

通过返回不同数量的输出参数,butter 直接地得到其它的滤波器实现。要获得传输函数形式,使用如下所示的两个输出参数。

注意 参考下面的限制 了解关于影响形成传输函数的数值问题。

[b,a] = butter(n,Wn) 设计一个阶为n,归一化截止频率为Wn的数字低通巴特沃斯滤波器。它返回滤波器系数在长度为n+1的行向量b和a中,这两个向量包含z的降幂系数。

[b,a] = butter(n,Wn,'ftype') 设计一个高通、低通或带阻滤波器,字符串'ftype' 是上面描述的'high'、'low'、或 'stop'。

要获得状态空间形式,使用下面所示的4个输出参数:

[A,B,C,D] = butter(n,Wn) 或

[A,B,C,D] = butter(n,Wn,'ftype') 其中 A、 B,、C,、和D 是

并且u是输入, x是状态向量, y 是输出。

模拟域

[z,p,k] = butter(n,Wn,'s') 设计一个阶n,截止角频率为Wn rad/s的模拟低通巴特沃斯滤波器。它返回零点和极点在长n或2n的列向量z和p中,标量k返回增益。butter的截止角频率Wn必须大于0 rad/s。

如果Wn是有两个元素w1<w2的向量, butter(n,Wn,'s') 返回阶 2n 带通模拟滤波器,其通带是w1 < ω < w2。

[z,p,k] = butter(n,Wn,'ftype','s') 通过使用上面描述的ftype 值可以设计一个高通、低通或带阻滤波器。

只要返回不同数量的输出参数,butter 可以直接地获得其它的模拟滤波器实现。要获得传输函数形式,使用如下所示的两个输出参数:

[b,a] = butter(n,Wn,'s') 设计一个阶n、截止角频率为Wn rad/s的模拟低通巴特沃斯滤波器。它返回滤波器的系数在长n+1的行向量b和a中,这两个向量包含下面这个传输函数中s的降幂系数:

[b,a] = butter(n,Wn,'ftype','s') 通过设置上面描述的ftype 值,可以设计一个高通、低通或带阻滤波器。

要获得状态空间形式,使用下面的四个参数:

[A,B,C,D] = butter(n,Wn,'s') 或

[A,B,C,D] = butter(n,Wn,'ftype','s') 其中A、 B、 C、和D 是

并且u 作为输入, x 是状态向量, y 是输出。

举例

高通滤波器

对于1000Hz的采样,设计一个9阶高通巴特沃斯滤波器,截止频率300Hz,相应的归一化值为06:

[z,p,k] = butter(9,300/500,'high');

[sos,g] = zp2sos(z,p,k); % 转换为二次分式表示形式

Hd = dfiltdf2tsos(sos,g); % 创建dfilt对象

h = fvtool(Hd); % 绘制幅度响应

set(h,'Analysis','freq') % 显示频率响应

step1:完成滤波器设计之后,点击文件-》export(导出),快捷键ctrl+ed出以下窗口:

step2:点击导出。这样滤波器系数就存到工作区workspace了。

以上是常用的fir型滤波器,系数只需要b,a=1 b为传递函数分子,a为分母。在fir情况a=1

如果设计iir型滤波器,系数由b和a组成。这样同时需要a和b。按照同样步骤导出系数到workspace。默认的系数存储为sos和g。以下代码可以转换为b,a形式:

[b,a] = sos2tf(sos,g)

如何使用滤波器呢?假设输入为x,那么输出y的滤波结果为:

y=filter(b,a,x)

给你“rinvc ”

不知道是不是你要的,随便找了个数值分析算法里头的

#include "stdlibh"

#include "mathh"

#include "stdioh"

int rinv(n,a)

int n;

double a[];

{ int is,js,i,j,k,l,u,v;

double d,p;

is=malloc(nsizeof(int));

js=malloc(nsizeof(int));

for (k=0; k=n-1; k++)

{ d=00;

for (i=k; i=n-1; i++)

for (j=k; j=n-1; j++)

{ l=in+j; p=fabs(a[l]);

if (p>d) { d=p; is[k]=i; js[k]=j;}

}

if (d+10==10)

{ free(is); free(js); printf("errnot inv\n");

return(0);

}

if (is[k]!=k)

for (j=0; j=n-1; j++)

{ u=kn+j; v=is[k]n+j;

p=a[u]; a[u]=a[v]; a[v]=p;

}

if (js[k]!=k)

for (i=0; i=n-1; i++)

{ u=in+k; v=in+js[k];

p=a[u]; a[u]=a[v]; a[v]=p;

}

l=kn+k;

a[l]=10/a[l];

for (j=0; j=n-1; j++)

if (j!=k)

{ u=kn+j; a[u]=a[u]a[l];}

for (i=0; i=n-1; i++)

if (i!=k)

for (j=0; j=n-1; j++)

if (j!=k)

{ u=in+j;

a[u]=a[u]-a[in+k]a[kn+j];

}

for (i=0; i=n-1; i++)

if (i!=k)

{ u=in+k; a[u]=-a[u]a[l];}

}

for (k=n-1; k>=0; k--)

{ if (js[k]!=k)

for (j=0; j=n-1; j++)

{ u=kn+j; v=js[k]n+j;

p=a[u]; a[u]=a[v]; a[v]=p;

}

if (is[k]!=k)

for (i=0; i=n-1; i++)

{ u=in+k; v=in+is[k];

p=a[u]; a[u]=a[v]; a[v]=p;

}

}

free(is); free(js);

return(1);

}

%下面程序可能对你有用,需根据你的指标修改一下前5行相关参数就行,至于最后显示部分,相应变化一下即可。

%1用Butterworth低通模拟滤波器原型%%%%%%%%%%%%%%%%%%%%%%%%%%%%数字滤波器指标

Wp=03pi; %通带边界频率(归一化):wp=fp2pi/fs

Ws=05pi; %阻带边界频率(归一化):ws=fr2pi/fs

Rp=05; %通带波纹

As=40; %阻带衰减

%转换为模拟滤波器指标(预畸);

Ts=0000125;fs=8000;

OmegaP=(2/Ts)tan(Wp/2); %模拟低通原型滤波器通带频率

OmegaS=(2/Ts)tan(Ws/2); %模拟低通原型滤波器阻带频率

[N,OmegaC]=buttord(OmegaP,OmegaS,Rp,As,'s'); %模拟巴特沃斯滤波器的阶数和-3dB截止频率计算,这时要加字符's'。

[z0,p0,k0]=buttap(N); %设计归一化巴特沃兹滤波器低通原型

%进行非归一化处理

p=p0OmegaC; z=z0OmegaC;

k=k0OmegaC^N;

ba=kreal(poly(z));

aa=real(poly(p));

[bd,ad]=bilinear(ba,aa,fs); %双线性变换

[h,w]=freqz(bd,ad); %计算频率响应

am=20log10(abs(h));

ph=angle(h);

%绘图

subplot(2,1,1);plot(w/pi,am);

axis([0 1 -250 5]);

xlabel('w(以pi为单位)');ylabel('|H(ejw)|以dB为单位');

set(gca,'XTickMode','manual','XTick',[0 03 05 1]);

set(gca,'YTickMode','manual','YTick',[ -40 0]);grid;

subplot(2,1,2);plot(w/pi,ph/pi);xlabel('w(以pi为单位)');ylabel('相位以pi为单位');

以上就是关于CIC滤波器设计全部的内容,包括:CIC滤波器设计、c语言中butte函数是什么意思、matlab中用fdatool设计的滤波器如何使用等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9756009.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存