关于fft补零提高频率分辨率的讨论
这是一篇值得讨论的问题,作者认为补零fft可以提高频率分辨率,并给出了试验结果,可以看出确实提高了对频率细节的观察能力,本人可以肯定这个试验是真实的试验。但是所有的数字信号教课书上都认为补零fft并不能提高频率分辨率,是不是有矛盾?
1 从分析角度, 设fs为采样频率,fft长度为N, 那么频率分辨率为fs/N, 如果N增加那么频率分辨率增加。这是下面一篇文章的用的论据。
2 从另一角度,设fs为采样频率,fft长度为N, 则频率分辨率为fs/N, 我们引进另一个概念:时间长度DT(duration of time), 可以看出DT = 1/频率分辨率. 则频率分辨率=1/DT 。从这一角度看只要DT不变,频率分辨率就不会变。因此尽管补零或插值,都不会提高分辨率。这是所有目前信号处理教科书的观点,但这些教科书都没有给出原因,不知道为什么,我发现这个问题是曾经找过不少教科书,没有一本给出原因,问老师也答的含糊不清。后来我反复考虑,感觉应该如此解释,如若有意见,欢迎讨论。
为什么两个角度看竟然矛盾?同样一个问题为什么有不同的解释
从1 我们看出,增加的值全为零,不是原信号内容,这就造成了特殊性,我们的信号变了不是原来信号了!而是新的补零信号的周期延拓。但是可以证明两个信号在对应点上的频谱值相同(直接利用定义即可推出)。至于补零后其它多点处的频谱是否是原信号的内容,这是问题的关键。 事实上,用于实用的方法不是下文里提到的方法,而是利用采样数据抽取,降低采样频率的方法来实现。因为数据长度一般在使用时都是最大长度,尤其是这种应用,肯定已经采用最大数据处理长度,不用问的。
我有一个试验,是多年前和一位同学讨论此类问题的试验,有兴趣的不妨试试.%% 用于检验补零FFT是否提高分辨率
%% 结论: 1。 补零fft提高分辨率是指信号加窗后的合成信号的分辨率。
% 这种情况下fft可以帮助分辨真实的峰值,但分辨率你可以计算一下应该改是不变的。 % 2。 如果信号=加窗后的合成信号 提高分辨率,如果加入点为真实的数据,当然提高分辨率。
% 4。 提高分辨细节的本质是由于窗的展宽,窗分辨细节率的提高引起的。这是一个用大窗观 察含有小窗信号的小窗的过程。补零而看到的频率细节不是信号本身的细节,而是窗的细节。
clear;
Nfft=16;
span=[0:Nfft-1]; omga=[1:3]*pi/8;
x=exp(j*omga(1)*span)+exp(j*omga(2)*span)+exp(j*omga(3)*span);stem(pi/Nfft*[0:Nfft-1],abs(fft(x,Nfft)),'r'); figure(2);
stem(pi/Nfft/2*[0:Nfft*2-1],abs(fft(x,Nfft*2)),'b'); figure(3); stem(pi/Nfft/16*[0:Nfft*16-1],abs(fft(x,Nfft*16)),'g');
原文连接:http://www.ed-china.com/ART_8800009929_400014_500012_TS.HTM 原文简介:
采用C语言程序处理FFT算法为力的扩大频谱的问题
如果你只是对计算小频率范围上的频谱有兴趣,那HRFT可能比FFT更有效。频率范围越窄,HRFT的吸引力就越大。当必须利用有限的存储资源在嵌入式系统中执行运算时,这一点尤为明显。
许多科学和工程应用都要求信号准确的频谱或傅立叶变换。式1以无量纲形式
(dimensionless form)给出,其中Ω = ΩT,T是采样间隔,q[n] = q(nT),代表信号q(t)的第n次采样。该式也假设信号为有限长序列,故总共仅有N 个连续采用点。Q(Ω)是连续变量Ω的周期函数,周期为2e。
常规求解方法是在区间Ω = [0, 2e]内的N个均匀间隔点上计算Q(Ω)的值。这个过程叫做离散傅立叶变换(DFT),通常利用快速傅利叶变换(FFT)的算法来完成。DFT给出点Ω = 2ek/N (k = 0...N -1)的傅立叶变换,从而按照实际频率给出了Ω=2e/(NT) 或f=1/(NT)的分辨率。对许多应用来说,这种分辨率可能已经足够。
对于某些应用,必须非常准确地确定频谱峰值(spectral peak)的位置。在这种情况下,DFT提供的分辨率可能不够。提高分辨率的方法之一就是简单地用额外的零来增加采样点。例如,为加倍频率分辨率,你可以在q[n]序列末尾增添N个零,使总的序列长度为2N。DFT将在2N个点上计算Q(Ω),从而使分辨率提高一倍。
为提高分辨率而增加的零的个数是有的。通常,只有在很小的频率范围内才需要提高分辨率。这里提供了一种简洁明了的办法,那就是直接在你感兴趣的频率范围上计算式1。下面给出有效算法。
采用欧拉恒等式,我们可以把式1分为实数和虚数两部分:
通过契比雪夫多项式(Chebyshev polynomials),我们从sinΩ和cosΩ开始,有效地进行sin(nΩ)和cos(nΩ)的递归运算。
在式4和式5中,已知T0 =1、T1=cosΩ、U0=1以及U1=2cosΩ,我们可以利用下列公式计算每一个Tn和Un。
现在我们只需要cosΩ和sinΩ,就能够以任意的高分辨率(远大于标准FFT)在一个非常小的频率范围上计算子频谱了。这一程序hrft用C语言编写,执行如下: hrft f1 f2 Nf N sps infile outfile
其中,f1=开始频率(Hz),f2=终止频率(Hz),Nf=计算FT的频率点数, N=从输入文件读取的采样点数,sps=每秒采样点数,infile=输入文件,outfile=输出文件。
图中显示了由FFT算法产生的从2260Hz到2268 Hz的部分频谱,以及由高分辨率傅立叶变换(HRFT)在该频率范围上产生的频谱。
两种方法都采用了相同的2048点数据集。FFT具有4 Hz/bin的分辨率,HRFT计算了41个点,分辨率为0.2 Hz/bin。显然,41点的HRFT3比3点FFT的图更平滑。数据集的主要频率为2265 Hz,据此我们可以看出HRFT方法准确定位了频率峰值,而用FFT定位的峰值则偏离了1Hz。为了利用FFT获得同样好的分辨率,必须添加零,以达到 65,536个点的序列长度。
如果你只是对计算小频率范围上的频谱有兴趣,那HRFT可能比FFT更有效。频率范围越窄,HRFT的吸引力就越大。当必须利用有限的存储资源在嵌入式系统中执行运算时,这一点尤为明显。
采用C语言程序处理FFT算法为力的扩大频谱的问题(转) 2009-05-20 17:59
如果你只是对计算小频率范围上的频谱有兴趣,那HRFT可能比FFT更有效。频率范围越窄,HRFT的吸引力就越大。当必须利用有限的存储资源在嵌入式系统中执行运算时,这一点尤为明显。
许多科学和工程应用都要求信号准确的频谱或傅立叶变换。式1以无量纲形式(dimensionless form)给出,其中Ω = ΩT,T是采样间隔,q[n] = q(nT),代
表信号q(t)的第n次采样。该式也假设信号为有限长序列,故总共仅有N 个连续采用点。Q(Ω)是连续变量Ω的周期函数,周期为2e。
常规求解方法是在区间Ω = [0, 2e]内的N个均匀间隔点上计算Q(Ω)的值。这个过程叫做离散傅立叶变换(DFT),通常利用快速傅利叶变换(FFT)的算法来完成。DFT给出点Ω = 2ek/N (k = 0...N -1)的傅立叶变换,从而按照实际频率给出了Ω=2e/(NT) 或f=1/(NT)的分辨率。对许多应用来说,这种分辨率可能已经足够。
对于某些应用,必须非常准确地确定频谱峰值(spectral peak)的位置。在这种情况下,DFT提供的分辨率可能不够。提高分辨率的方法之一就是简单地用额外的零来增加采样点。例如,为加倍频率分辨率,你可以在q[n]序列末尾增添N个零,使总的序列长度为2N。DFT将在2N个点上计算Q(Ω),从而使分辨率提高一倍。
信号采样序列的傅立叶变换如式1所示。
为提高分辨率而增加的零的个数是有的。通常,只有在很小的频率范围内才需要提高分辨率。这里提供了一种简洁明了的办法,那就是直接在你感兴趣的频率范围上计算式1。下面给出有效算法。
采用欧拉恒等式,我们可以把式1分为实数和虚数两部分:
通过契比雪夫多项式(Chebyshev polynomials),我们从sinΩ和cosΩ开始,有效地进行sin(nΩ)和cos(nΩ)的递归运算。
在式4和式5中,已知T0 =1、T1=cosΩ、U0=1以及U1=2cosΩ,我们可以利用下列公式计算每一个Tn和Un。
现在我们只需要cosΩ和sinΩ,就能够以任意的高分辨率(远大于标准FFT)在一个非常小的频率范围上计算子频谱了。这一程序hrft用C语言编写,执行如下:
hrft f1 f2 Nf N sps infile outfile
其中,f1=开始频率(Hz),f2=终止频率(Hz),Nf=计算FT的频率点数, N=从输入文件读取的采样点数,sps=每秒采样点数,infile=输入文件,outfile=输出文件。
图中显示了由FFT算法产生的从2260Hz到2268 Hz的部分频谱,以及由高分辨率傅立叶变换(HRFT)在该频率范围上产生的频谱。
两种方法都采用了相同的2048点数据集。FFT具有4 Hz/bin的分辨率,HRFT计算了41个点,分辨率为0.2 Hz/bin。显然,41点的HRFT3比3点FFT的图更平滑。数据集的主要频率为2265 Hz,据此我们可以看出HRFT方法准确定位了频率峰值,而用FFT定位的峰值则偏离了1Hz。为了利用FFT获得同样好的分辨率,必须添加零,以达到 65,536个点的序列长度。
如果你只是对计算小频率范围上的频谱有兴趣,那HRFT可能比FFT更有效。频率范围越窄,HRFT的吸引力就越大。当必须利用有限的存储资源在嵌入式系统中执行运算时,这一点尤为明显。