频谱细化-----FFT+FT算法介绍及MATLAB实现

FFT+FT算法原理

设信号的长度为 M M M,设FFT点数为 N N N N > M N>M N>M,即对信号补零进行FFT, N N N点FFT算法对应的DFT变换公式为
X ( k ) = ∑ n = 0 N − 1 x ( n ) W N k n , k = 0 , 1 , . . . , N − 1 X\left( k \right)=\sum\limits_{n=0}^{N-1}{x\left( n \right)W_{N}^{kn}},k=0,1,...,N-1 X(k)=n=0N1x(n)WNkn,k=0,1,...,N1
经过补零后的 N N N点FFT算法对应的DFT变换公式为
X ( k ) = ∑ n = 0 N − 1 x ( n ) e − j 2 π N k n X\left( k \right)=\sum\limits_{n=0}^{N-1}{x\left( n \right){{e}^{-j\frac{2\pi }{N}kn}}} X(k)=n=0N1x(n)ejN2πkn
由于补零后的信号从 M M M N − 1 N-1 N1之间都是0,那么
X ( k ) = ∑ n = 0 M − 1 x ( n ) e − j 2 π N k n X\left( k \right)=\sum\limits_{n=0}^{M-1}{x\left( n \right){{e}^{-j\frac{2\pi }{N}kn}}} X(k)=n=0M1x(n)ejN2πkn
设从FFT算法计算出的频谱中寻找到频谱最大值对应谱线的标号为 k 0 {{k}_{0}} k0,次大值频谱对应的谱线标号为 k 1 {{k}_{1}} k1,即
X ( k 0 ) = ∑ n = 0 M − 1 x ( n ) e − j 2 π k 0 N n X\left( {{k}_{0}} \right)=\sum\limits_{n=0}^{M-1}{x\left( n \right){{e}^{-j2\pi \frac{{{k}_{0}}}{N}n}}} X(k0)=n=0M1x(n)ej2πNk0n
X ( k 1 ) = ∑ n = 0 M − 1 x ( n ) e − j 2 π k 1 N n X\left( {{k}_{1}} \right)=\sum\limits_{n=0}^{M-1}{x\left( n \right){{e}^{-j2\pi \frac{{{k}_{1}}}{N}n}}} X(k1)=n=0M1x(n)ej2πNk1n
由于栅栏效应导致频谱最大值与频谱次大值之间的频率没有被检测出来,为了提高精度需要得到 k 0 / N {{k}_{0}}/N k0/N k 1 / M = ( k 0 ± 1 ) / M {{k}_{1}}/M=\left( {{k}_{0}}\pm 1 \right)/M k1/M=(k0±1)/M更多的值,也就是对初期通过FFT算法计算得到的频谱做进一步的细化处理。
设在原相邻频谱线之间再细化 K K K倍,也就是需要求得频谱在如下频点的频谱幅值:
K ⋅ k 0 K ⋅ N , K ⋅ k 0 + 1 K ⋅ N , . . . , K ⋅ k 0 + K − 1 K ⋅ N , K ⋅ k 0 + K K ⋅ N , k 1 = k 0 + 1 \frac{K\centerdot {{k}_{0}}}{K\centerdot N},\frac{K\centerdot {{k}_{0}}+1}{K\centerdot N},...,\frac{K\centerdot {{k}_{0}}+K-1}{K\centerdot N},\frac{K\centerdot {{k}_{0}}+K}{K\centerdot N},{{k}_{1}}={{k}_{0}}+1 KNKk0,KNKk0+1,...,KNKk0+K1,KNKk0+K,k1=k0+1
或在如下频点的频谱幅值
K ⋅ k 1 K ⋅ N , K ⋅ k 1 + 1 K ⋅ N , . . . , K ⋅ k 1 + K − 1 K ⋅ N , K ⋅ k 1 + K K ⋅ N , k 1 = k 0 − 1 \frac{K\centerdot {{k}_{1}}}{K\centerdot N},\frac{K\centerdot {{k}_{1}}+1}{K\centerdot N},...,\frac{K\centerdot {{k}_{1}}+K-1}{K\centerdot N},\frac{K\centerdot {{k}_{1}}+K}{K\centerdot N},{{k}_{1}}={{k}_{0}}-1 KNKk1,KNKk1+1,...,KNKk1+K1,KNKk1+K,k1=k01
计算上述频点对应的频谱的时候,只需要调用DFT公式计算,不需要使用DFT计算整个频谱。
下面对上述算法进行仿真
参数设置为

参数名称参数值
信号长度2048
采样率4096
FFT点数2048
信号频率346.6Hz

仿真结果如下:
在这里插入图片描述
从图中可以看出,直接进行FFT变换的话是无法分辨出频率为346.6Hz的信号,但是经过FFT+FT算法细化之后可以得到信号的信号的频率的,也体现了频谱细化的好处。
代码如下:

clear;
close all;
clc;
N=1024;                 %信号长度
fs=4096;                %采样率
t=(0:N-1)/fs;  
x=exp(-2*pi*0.005*346.6.*t).*cos(2*pi*346.6.*t+pi/3); %信号
y=fft(x,1024); %信号傅氏变换
figure(1) 
f1=(0:N-1)/N*fs; 
figure(1);
subplot(211);
plot(f1(1:N/2),2/N*abs(y(1:N/2)));
xlabel('f/Hz');
title('直接进行FFT')
f=342:0.1:352;    
for k=1:length(f)
    xf(k)=2/N*sum(x.*exp(-1j*2*pi*(0:N-1)*f(k)/fs)); 
end     
subplot(212);
plot(f,abs(xf)) 
title('FFT+FT算法处理后') 
  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值