峰陷滤波器的设计

这个例子展示了如何设计峰值和陷波滤波器。在特定频率上达到峰值或陷波的滤波器对于保留或消除信号的特定频率成分是有用的。滤波器的设计参数是期望的峰值或陷波口的频率,以及3db带宽或滤波器的q因子。此外,给定这些规格,通过增加滤波器的阶数,就有可能得到更接近理想滤波器的设计。

切口过滤器

假设您需要消除3000hz采样信号中的60hz干扰。一个陷波滤波器可以用于这种目的。

F0 = 60;%干扰在60hzFs = 3000;%采样频率为3000hznotchspec = fdesign.notch (“N, F0,问“2, F0 10 Fs);notchfilt =设计(notchspec,“SystemObject”,真正的);fvtool (notchfilt“颜色”“白色”);

滤波器的质量因子或q因子是衡量所需频率与其他频率隔离程度的指标。对于固定的滤波阶数,较高的q因子是通过将极点推向零点来实现的。

notchspec。Q = 100;notchfilt1 =设计(notchspec,“SystemObject”,真正的);fvt = fvtool (notchfilt notchfilt1,“颜色”“白色”);传奇(fvt“Q = 10”“Q = 100”);

一种等效的指定质量因子的方法是指定3db带宽,BW。它们之间的关系是Q = F0/BW。指定带宽可能是精确实现所设计滤波器的理想形状的一种更方便的方法。

notchspec = fdesign.notch (“N, F0, BW”2 60, 3000);notchfilt2 =设计(notchspec,“SystemObject”,真正的);Fvt = fvtool(notchfilt, notchfilt1, notchfilt2,“颜色”“白色”);传奇(fvt“Q = 10”“Q = 100”'BW = 5 Hz');

由于它只能将极点推到一定的距离并保持稳定,为了改善滤波器的砖墙近似,有必要增加滤波器的阶数。

notchspec = fdesign.notch (“N, F0,问“2、.4,100);notchfilt =设计(notchspec,“SystemObject”,真正的);notchspec。FilterOrder = 6;notchfilt1 =设计(notchspec,“SystemObject”,真正的);fvt = fvtool (notchfilt notchfilt1,“颜色”“白色”);传奇(fvt二阶滤波器的6阶滤波器的);

对于给定的阶数,我们可以通过允许通带和/或阻带纹波来获得更清晰的跃迁。

N = 8;F0 = 0.4;BW = 0.1;notchspec = fdesign.notch (“N, F0, BW”N F0、BW);notchfilt =设计(notchspec,“SystemObject”,真正的);notchspec1 = fdesign.notch (' N, F0, BW,美联社,Ast的N F0、BW 0.5, 60);notchfilt1 =设计(notchspec1,“SystemObject”,真正的);fvt = fvtool (notchfilt notchfilt1,“颜色”“白色”);传奇(fvt“最大平面8阶滤波器”...“带通带/阻带波纹的八阶滤波器”...“位置”“西北”);轴([0 1 -90 0.5]);

峰过滤器

如果我们想要保留信号中的单个频率成分(或小频带的频率),则使用峰值滤波器。到目前为止提到的所有规格和权衡同样适用于峰值滤波器。这里有一个例子:

N = 6;F0 = 0.7;BW = 0.001;peakspec = fdesign.peak (“N, F0, BW”N F0、BW);peakfilt =设计(peakspec,“SystemObject”,真正的);peakspec1 = fdesign.peak (“N, F0, BW, Ast”N F0, BW, 80);peakfilt1 =设计(peakspec1,“SystemObject”,真正的);fvt = fvtool (peakfilt peakfilt1,“颜色”“白色”);传奇(fvt“最大平面六阶滤波器”...“阻带衰减80 dB的六阶滤波器”“位置”“北”);

时变陷波滤波器的实现

使用时变滤波器需要在仿真运行时改变滤波器的系数。为了补充基于fdesign对象的自动滤波器设计工作流,DSP系统工具箱提供了其他功能,包括直接计算滤波器系数的功能,例如iirnotch

一个有用的起点是从动态(流)模拟中调用的静态筛选器。在这种情况下,一个二阶陷波滤波器直接创建,其系数计算与iirnotch。设计参数为1 kHz的中心频率和50 Hz的带宽-3 dB和8 kHz的采样频率。

Fs = 8 e3;% 8千赫采样频率F0 = 1 e3 / (Fs / 2);%缺口在2千赫BW = 500 / (Fs / 2);% 500hz带宽[b, a] = iirnotch(F0, BW)% #好吧biquad = dsp。BiquadFilter (“SOSMatrix”[b]);= dsp范围。简介(“PlotAsTwoSidedSpectrum”假的,...“SampleRate”Fs,...“SpectralAverages”16);samplesPerFrame = 256;nFrames = 4096;k = 1:nFrames x = randn(samplesPerFrame, 1);y = biquad (x);范围(y);结束
a = 1.0000 -1.1796 0.6682

时变滤波器的系数需要随着时间而变化,这是由于设计参数的运行时变化(例如陷波器的中心频率)。对于设计参数的每一次改变,都需要重新计算系数向量b和a。SOSMatrix设置为新值。这在计算上是很昂贵的。对于这种类型的应用dsp。CoupledAllpassFilter可以提供更方便的过滤结构。优点包括-固有稳定性-系数与设计参数解耦

建立一个耦合的全通晶格滤波器等效于双四极管[k1, k2] = tf2cl(b, a)% #好吧apnotch = dsp。CoupledAllpassFilter (“格子”k1, k2);fvtool (apnotch“Fs”Fs)
K1 = [] k2 = -0.7071 0.6682

这种基于全通的结构的一个好处是,新的系数与设计参数F0和BW是解耦的。例如,F0到3khz的变化会产生

F0 = 3 e3 / (Fs / 2);[b, a] = iirnotch(F0, BW)% #好吧[k1, k2] = tf2cl(b, a)% #好吧注:当a和b都改变时,在格子中全部通过了设计%只影响k2(1)%现在改变带宽为1 kHzBW = 1 e3 / (Fs / 2);[b, a] = iirnotch(F0, BW)% #好吧[k1, k2] = tf2cl(b, a)% #好吧%设计更改现在只影响k2(2)系数解耦在实时系统中有许多优点,%包括更多的经济系数更新和更可预测系数变化时的瞬态行为
[] k2 = 0.7071 0.6682 B = 0.7071 1.0000 0.7071 a = 1.0000 1.0000 0.4142 k1 = [] k2 = 0.7071 0.4142

下面应用上述原理在动态仿真过程中改变设计参数,包括实时可视化对滤波器传递函数估计的影响。在现实世界的应用中,人们通常会确定将每个设计参数与相应的晶格全通系数相连接的单个表达式。在主仿真循环中使用这些函数而不是像iirnotch和tf2cl这样的全滤波器函数将提高效率。

陷波滤波器参数-如何随时间变化Fs = 8 e3;% 8千赫采样频率f0 = 1e3*[0.5, 1.5, 3,2]/(f0 /2);%在[0,1]范围内bw = 500/(Fs/2) * ones(1,4);%在[0,1]范围内myChangingParams =结构(“F0”num2cell (f0),“BW”num2cell (bw));paramsChangeTimes = [0, 7, 15, 20];%在几秒钟内%模拟时间管理nSamplesPerFrame = 256;往往= 30;nSamples = ceil(tEnd * Fs);nFrames = floor(nSamples / nSamplesPerFrame);%对象创建apnotch = dsp。CoupledAllpassFilter (“格子”);= dsp范围。简介(“PlotAsTwoSidedSpectrum”假的,...“SampleRate”Fs,...“SpectralAverages”4...“RBWSource”“汽车”);paramtbl = dspdemo。ParameterTimeTable (“时间”paramsChangeTimes,...“值”myChangingParams,...“SampleRate”Fs / nSamplesPerFrame);实际仿真回路frameIdx = 1: nFrames%获取当前F0和BW[params, update] = paramtbl();如果(更新)如果参数改变,重新计算滤波系数[b, a] = iirnotch()F0、params.BW);[k1, k2] = tf2cl(b, a);%设置过滤器系数为新值apnotch。LatticeCoefficients1 {1} = k1;apnotch。LatticeCoefficients2 {1} = k2;结束%生成白噪声样本向量x = randn(nSamplesPerFrame, 1);%过滤噪音y = apnotch (x);%可视化频谱范围(y);结束