主要内容

zoom fft.

该示例展示了变焦FFT,其是用于分析高分辨率的一部分频谱的信号处理技术。DSP System Toolbox™在Matlab™中提供此功能dsp.zoomfft.系统对象,并通过缩放FFT库块的Simuli金宝appnk。

正则FFT

信号的分辨率受其长度的限制。我们将通过一个简单的例子来说明这个事实。考虑一个由两个正弦波之和构成的信号:

L=32;%帧大小FS = 128;%采样率res = fs / l;%频率分辨率f1=40;%第一正弦波频率f2=f1+res;%第二次正弦波频率sn1 = dsp.sinewave('频率',f1,“采样器”,fs,'samplesperframe',L);sn2=dsp.SineWave('频率',f2,“采样器”,fs,'samplesperframe'L...'振幅'2);X = sn1() + sn2();

让我们计算x的FFT,并绘制FFT的幅度图。注意,两个正弦波在FFT的相邻样本中。这意味着您无法区分比Fs/L更接近的频率。

x = fft(x);茎(FS / L *(0:长度(x)-1)-fs / 2,abs(fftshift(x))/ l)网格;Xlabel(‘频率(Hz)’) ylabel (“震级”) 标题('双面谱')

zoom fft.

假设您有一个只对奈奎斯特区间的子带感兴趣的应用程序。变焦FFT背后的想法是,通过在较短的信号上计算一个较小的FFT,保持与原始信号上的全尺寸FFT相同的分辨率。较短的信号来自于对原始信号的抽取。这种节省来自于能够在实现相同分辨率的同时计算更短的FFT。这很直观:对于抽取因子D,新的采样率为Fsd = Fs/D,新的帧长(FFT长度)为Ld = L/D,因此抽取信号的分辨率为Fsd/Ld = Fs/L。

DSP System Toolbox为Matlab和Simulink的缩放FFT功能分别通过DSP.Zoomfft系统对象和缩放金宝appFFT库块。下一部分将更详细地讨论缩放FFT算法。

混音器方法

在讨论dsp.FFT中使用的算法之前,我们先介绍混频器方法,这是一种流行的细化FFT方法。

对于这里的示例,假设您只对间隔[16 Hz,48 Hz]感兴趣。

bwofinterest = 48  -  16;FC =(16 + 48)/ 2;%感兴趣带宽的中心频率

可实现的抽取因子是:

BWFactor=楼层(Fs/BWOfInterest);

混频器方法包括首先使用混频器将感兴趣的频带下移到DC,然后通过BWFactor的因子(使用有效的多相FIR抽取结构)执行低通滤波和抽取。

让我们使用函数设计抽取滤波器的系数设计多速率:

B=设计多速率FIR(1,BWFactor);D=dsp.FIRDecimator(“决策因素”,BWFactor,“分子”,b);

现在,让我们将信号混合到直流,并通过FIR抽取器对其进行滤波:

对于k=1:10%运行几次,以消除瞬态过滤器x = sn1 sn2 () + ();%混合到DCIndvect =(0:numel(x)-1)。'+(k-1)*尺寸(x,1);y = x。* exp(-2 * pi * demvect * fc * 1j / fs);%过滤通过FIR DECIMATORxd = d(y);终止

现在让我们采取过滤信号的FFT(请注意,与常规FFT相比,BWFactor或抽取长度减小FFT长度,同时保持相同的分辨率):

fftlen = numel(xd);XD = FFT(XD);图ld = l / bwfactor;fsd = fs / bwfactor;F = FC + FSD / FFTLEN *(0:FFTLEN-1)-FSD / 2;茎(F,ABS(FFTSHIFT(XD))/ LD)网格Xlabel(‘频率(Hz)’) ylabel (“震级”) 标题(“缩放FFT频谱。混频器方法。”)

复值混频器为每一个高速率的样品增加一个额外的乘法,这是无效的。下一节将介绍另一种更有效的变焦FFT方法。

BANDPASS采样

另一种变焦FFT方法利用了带通滤波(有时也称为欠采样)的已知结果:假设我们对采样率为Fs Hz的信号的频带[F1,F2]感兴趣。如果我们将信号通过一个以Fc = (F1+F2)/2为中心、带宽BW = F2 - F1的复(单边)带通滤波器,然后对其进行因子D = floor(Fs/BW)的采样,我们将把所需的频带降至基带。

通常,如果FC不能以k * fs / d(其中k为整数),则移位的抽取频谱不会以dc为中心。事实上,中心频率fc将被翻译成[2]:

Fd=Fc-(Fs/D)*楼层((D*Fc+Fs/2)/Fs)

在这种情况下,我们可以使用混频器(以抽取信号的低采样率运行)将所需频带居中至零赫兹。

使用前一节中的示例,通过调制设计的低通滤波器的系数,我们获得复杂带通滤波器的系数:

bbp = b。* exp(1j *(fc / fs)* 2 * pi *(0:numel(b)-1));d = dsp.firdecimator(“决策因素”,BWFactor,“分子”,Bbp);

让我们现在执行过滤和FFT:

对于k=1:10%运行几次,以消除瞬态过滤器x = sn1 sn2 () + ();xd = D (x);终止Xd=fft(Xd);图阀杆(F、abs(FFT换档(Xd))/Ld)网格Xlabel(‘频率(Hz)’) ylabel (“震级”) 标题(“缩放FFT频谱。带通采样方法。”)

使用多速率,多级带通滤波器

来自上一节的过滤器是单级滤波器。我们可以通过使用多级设计来实现更少的计算复杂过滤器。这是dsp.zoomfft中遵循的方法。

让我们考虑下面的例子,其中输入采样率是48 kHz,并且感兴趣的带宽是间隔[15002500 ] Hz。可实现的抽取因子是Lead(48000/1000)=48。

让我们先设计一个单级小数:

Fs=48e3;Fc=2000;%带通滤波器中心频率BW=1e3;%感兴趣的带宽AST = 80;%阻带衰减BWFactor=地板(Fs/BW);B=设计多速率FIR(1,BWFactor,12,80);Bbp=B.*exp(1j*(Fc/Fs)*2*pi*(0:numel(B)-1));D_单级=dsp.FIRDecimator(“决策因素”,BWFactor,“分子”,Bbp);

现在,让我们使用多级设计来设计滤波器,同时保持与单级情况相同的阻带衰减和过渡带宽(参见Kaiserord.有关过渡宽度计算的细节):

tw=(Ast-7.95)/(努美尔(B)*2.285);fmd=设计抽取器(BWFactor,“奈奎斯特”,BWFactor,...“TW,Ast”,TW * FS /(2 * PI),AST,FS);d_multi_stage = multimarage(fmd,'halfbanddesignmethod',“等波纹”,“系统对象”,true);fprintf('筛选阶段的数量:%d\n'getNumStages (D_multi_stage));fprintf('阶段1:抽取因子=%d,筛选器长度=%d\n',...d_multi_stage.stage1.decimationFactor,...元素个数(D_multi_stage.Stage1.Numerator));fprintf('阶段2:抽取因子=%d,筛选器长度=%d\n',...d_multi_stage.stage2.decimationFactor,...numel(d_multi_stage.stage2.numerator));fprintf('第3阶段:抽取因子=%d,过滤长度=%d \ n',...d_multi_stage.stage3.decimationFactor,...numel(D_多阶段阶段3.分子);
过滤器阶段数:3阶段1:抽取因子= 6,滤波器长度= 33级2:抽取因子= 2,滤波长= 11级:抽取因子= 4,滤波长度= 101

请注意,D_multi_stage是一个三级多速率低通滤波器。我们通过对每个级的系数进行频移,将其转换为带通滤波器,同时考虑累积抽取因子:

num1 = d_multi_stage.stage1.numerator;num2 = d_multi_stage.stage2.numerator;num3 = d_multi_stage.stage3.numerator;n1 =长度(num1)-1;n2 =长度(num2)-1;n3 =长度(num3)-1;%阶段1和阶段2之间的抽取系数:M12 = D_multi_stage.Stage1.DecimationFactor;%第2阶段和第3阶段之间的抽取因子:M23 = D_multi_stage.Stage2.DecimationFactor;num1 = num1 .*exp(1j*(Fc / Fs)*2*pi*(0:N1));num2 = num2。* exp (1 j * (Fc * M12 / Fs) * 2 *π* (0:N2));num3 = num3。* exp (1 j * (Fc * M12 * M23 / Fs) * 2 *π* (0:N3));D_multi_stage.Stage1。分子= num1;D_multi_stage.Stage2。分子= num2;D_multi_stage.Stage3。分子= num3;

让我们比较一下单级和多级过滤器的成本:

fprintf('单级筛选器成本:\n\n')成本(d_single_stage)fprintf('多级筛选器成本:\n')成本(D_多阶段)
单级筛选器成本:ans=带字段的结构:NumCoefficients:1129个NumStates:1104乘法SPERINPUTSAMPLE:23.5208加法SPERINPUTSAMPLE:23.5000多级筛选器成本:ans=带字段的结构:NumCoefficients:113个NumStates:140乘法SPERINPUTSAMPLE:7.0208加法SPERINPUTSAMPLE:6.7500

我们也来比较一下这两个滤波器的频率响应:

vis = fvtool(d_single_stage,d_multi_stage,“设计面具”,'离开','传奇',“开”);传奇(vis、“单级”,“多阶段”)

让我们使用多级过滤器来执行缩放FFT:

fftlen = 32;l = Bwfactor * FFTLEN;音调= [1625 2000 2125];%正弦波音调sn = dsp.sinewave(“采样器”,fs,'频率'、音调...'samplesperframe',L);Fsd=Fs/BWFactor;计算FFT的%频率点F=Fc+Fsd/fftlen*(0:fftlen-1)-Fsd/2;ap=dsp.ArrayPlot('xdatamode','风俗',...“自定义扩展数据”F...“YLabel”,“震级”,...'xlabel',‘频率(Hz)’,...'ylimits',[0 1],...“标题”,Sprintf('缩放FFT。分辨率=%f hz',(fs / bwfactor)/ fftlen)));对于k=1:100 x=sum(sn(),2)+1e-2*randn(L,1);y=D_多级(x);z=fft(y,fftlen,1);z=fft移位(z);ap(abs(z)/fftlen)终止释放(美联社)

使用dsp.ZoomFFT

dsp.ZoomFFT是一个系统对象,它基于上一节中强调的多速率多级带通滤波器实现zoom FFT。您可以指定所需的中心频率和抽取因子,dsp.ZoomFFT将设计滤波器并将其应用于输入信号。

让我们使用dsp.ZoomFFT放大上一节示例中的正弦音调:

zfft = dsp.ZoomFFT (BWFactor、Fc、Fs);对于k = 1:100 x = sum(sn(),2)+ 1e-2 * randn(l,1);z = zfft(x);z = fftshift(z);AP(ABS(Z)/ FFTLEN)终止释放(美联社)

Zoom FFT 金宝appSimulink模块

缩放FFT块将DSP.Zoomfft的功能带来了Simulink。金宝app在模型中dspzoomfft.,我们使用缩放FFT块检查输入信号的频带[800Hz,1600 Hz],其在44100Hz处采样。

参考文献

[1] 多速率信号处理-哈里斯(普伦蒂斯大厅)。

数字化和下采样模拟带通中转换频率的计算https://www.dsprelated.com/showarticle/523.php.)