关于fft补零提高频率分辨率的讨论
- 格式:doc
- 大小:117.51 KB
- 文档页数:6
关于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可以帮助分辨真实的峰值,但分辨率你可以计算一下应该改是不变的。
傅里叶变换(FFT)是一种用于信号处理和频谱分析的重要数学工具。
在FFT中,补零(Zero Padding)是一种常见的技术,通过在信号的末尾添加零值来增加信号的长度。
这个过程可以影响信号的频谱表示,特别是对相位产生一些影响。
下面将详细讨论FFT补零对相位的影响。
### **FFT基础知识回顾:**在理解FFT补零对相位的影响之前,我们需要回顾一下FFT的基础知识。
FFT是一种将时域信号转换为频域信号的算法,它可以将信号分解成一系列不同频率的正弦和余弦成分,从而提供了信号在频域上的表示。
FFT输出通常包括幅度谱和相位谱两部分。
### **FFT补零的基本原理:**FFT补零是通过在信号的末尾添加零值,使得信号的长度达到某个规定的长度(通常是2的幂次方)。
这样做的目的有几个:1. **提高频谱分辨率:** 补零可以在频域上增加更多的点,提高频谱分辨率,使得频谱更加精细。
2. **FFT算法优化:** 很多FFT算法要求输入信号的长度为2的幂次方,补零可以满足这个条件,提高FFT算法的运算效率。
### **对幅度谱的影响:**补零对幅度谱的影响相对较小。
补零后,频谱的主瓣(主要幅度集中的地方)不会发生变化,只是在主瓣之间插入了更多的零值。
因此,幅度谱的整体形状基本保持不变,主要影响体现在细节上。
### **对相位谱的影响:**补零对相位谱有一些明显的影响:1. **频谱插值:** 补零会在频谱中插入零值,导致相位谱的插值效应。
这意味着在补零后的频谱中,相位信息将更加平滑,可能失去一些高频细节。
2. **相位不稳定性:** 补零可能导致相位谱在某些频率范围内变得不稳定,特别是在主瓣附近。
这是因为插值效应会导致相邻频率点的相位差异较大。
### **应用场景:**1. **频谱分辨率要求高:** 当需要对信号进行高精度频谱分析时,补零可以提高频谱分辨率,使得频谱更加精细。
2. **相位信息不敏感的场合:** 如果应用场景对相位信息不敏感,而更关心幅度谱的细节,那么可以考虑使用补零。
《数字信号处理》专题设计题目补零对离散序列频谱计算的影响学院信息工程学院专业通信工程班级通信1405组员刘佳丽刘婷林思辰指导教师郭志强2017年5月14日目录摘要 (I)Abstract (II)1 引言 (1)2 设计原理 (2)3 MATLAB验证 (5)3.1 DFT函数 (5)3.2绘制频谱 (5)3.3实验结果 (6)4 总结 (8)5参考文献 (9)摘要“补零”是指在序列的有效数据中填补一些零值,人为地延长序列,以达到对频谱做某种改善的目的,经常运用于DFT的运算中。
本文主要介绍了在不同位置补零对序列的频谱及DFT的影响,并得出补零不能提高分辨率的结论,最后通过MATLAB程序对其进行验证,证明该结论的正确性。
关键词:补零;频谱;DFT;分辨率Abstract"Zero padding" refers to fill some of the zero value in the sequence of valid data, artificially extended sequence, to achieve the purpose of make some improvement on spectrum, often working in DFT calculations. In different position zero padding is mainly introduced in this paper the spectrum of sequence and the influence of the DFT, and zero padding can't improve the resolution of the conclusion, finally through MATLAB to validate it, prove the correctness of the conclusion.Key words: fill zero; Spectrum; DFT. Resolution;1 引言“补零”是指在序列的有效数据中填补一些零值,人为地延长序列,以达到对频谱做某种改善的目的。
dft 时域末尾补零频域
当进行离散傅里叶变换(DFT)时,在时域末尾补零会对频域产生影响。
首先,让我们了解一下DFT的基本原理。
DFT是一种将离散时间域信号转换为离散频率域信号的方法。
在进行DFT时,输入信号的长度通常是有限的,如果在时域末尾补零,意味着在原始信号的末尾增加一些零值样本。
这种操作会对DFT的频域表示产生几种影响。
首先,补零会增加信号的长度,这意味着在频域中会得到更多的频率分量。
频域的分辨率将会提高,因为频率分量之间的间隔会变小。
这对于在频域中精确分析信号的频率成分是有益的。
其次,补零会对频域中的幅度产生影响。
在进行DFT时,零值样本会被包含在变换中,因此会影响频域中的幅度计算。
这意味着在频域中会出现插值的效果,有时会使得频域中的幅度谱变得更加平滑。
另外,补零也会对频域中的相位产生影响。
由于在时域中添加了零值样本,会导致频域中的相位插值,这可能会对信号的相位分析产生影响。
总的来说,在进行DFT时,在时域末尾补零会对频域产生影响,增加频域的分辨率,影响频域中的幅度和相位计算。
这种操作通常
用于信号处理中的频谱分析和频域插值,但需要注意对信号特性的
影响。
希望这些信息能够帮助你更好地理解这个问题。
高分辨反傅里叶变换
高分辨反傅里叶变换是一种信号处理技术,主要用于提高信号的频率分辨率。
它通过在频域中对信号进行补零操作,从而在反傅里叶变换过程中实现对信号的高分辨率分析。
傅里叶变换是将信号从时域转换到频域的一种方法。
然而,在实际应用中,由于采样点数限制,有时会导致频率分辨率不高。
为了解决这个问题,可以使用高分辨反傅里叶变换。
高分辨反傅里叶变换的主要步骤如下:
1. 对信号进行傅里叶变换,得到其在频域的表现。
2. 在频域中对信号进行补零操作,提高采样点数。
3. 利用傅里叶逆变换,将补零后的信号转换回时域。
补零操作的本质是增加采样点数,从而提高频率分辨率。
在傅里叶变换的双向性基础上,补零操作在频域中提高了频率分辨率,同时在时域中对信号进行了插值。
高分辨反傅里叶变换在信号处理、图像处理等领域有广泛应用。
例如,在图像处理中,高分辨反傅里叶变换可以将图像分解成正弦和余弦分量,从而实现对图像频率特性的分析。
通过修改复数图像或幅度/相位图像中的象函数,还可以间接地调整原函数,从而实现对图像的优化处理。
综上所述,高分辨反傅里叶变换是一种有效的信号处理方法,可以通过补零操作提高信号的频率分辨率,从而在实际应用中更好地分析信号特征。
[FFT] matlab中关于FFT的使用(理解频率分辨率、补零问题).txt我这人从不记仇,一般有仇当场我就报了。
没什么事不要找我,有事更不用找我!就算是believe中间也藏了一个lie!我那么喜欢你,你喜欢我一下会死啊?我又不是人民币,怎么能让人人都喜欢我?[FFT]matlab中关于FFT的使用(理解频率分辨率、补零问题)一.调用方法X=FFT(x);X=FFT(x,N);x=IFFT(X);x=IFFT(X,N)用MATLAB进行谱分析时注意:(1)函数FFT返回值的数据结构具有对称性。
例:N=8;n=0:N-1;xn=[4 3 2 6 7 8 9 0];Xk=fft(xn)→Xk =39.0000 -10.7782 + 6.2929i 0 - 5.0000i 4.7782 - 7.7071i 5.0000 4.7782 + 7.7071i 0 + 5.0000i -10.7782 - 6.2929iXk与xn的维数相同,共有8个元素。
Xk的第一个数对应于直流分量,即频率值为0。
(2)做FFT分析时,幅值大小与FFT选择的点数有关,但不影响分析结果。
在IFFT时已经做了处理。
要得到真实的振幅值的大小,只要将得到的变换后结果乘以2除以N即可。
二.FFT应用举例例1:x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t)。
采样频率fs=100Hz,分别绘制N=128、1024点幅频图。
clf;fs=100;N=128; %采样频率和数据点数n=0:N-1;t=n/fs; %时间序列x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号y=fft(x,N); %对信号进行快速Fourier变换mag=abs(y); %求得Fourier变换后的振幅f=n*fs/N; %频率序列subplot(2,2,1),plot(f,mag); %绘出随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('N=128');grid on;subplot(2,2,2),plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('N=128');grid on;%对信号采样数据为1024点的处理fs=100;N=1024;n=0:N-1;t=n/fs;x=0.5*sin(2*pi*15*t)+2*sin(2*pi*40*t); %信号y=fft(x,N); %对信号进行快速Fourier变换mag=abs(y); %求取Fourier变换的振幅f=n*fs/N;subplot(2,2,3),plot(f,mag); %绘出随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('N=1024');grid on;subplot(2,2,4)plot(f(1:N/2),mag(1:N/2)); %绘出Nyquist频率之前随频率变化的振幅xlabel('频率/Hz');ylabel('振幅');title('N=1024');grid on;运行结果:fs=100Hz,Nyquist频率为fs/2=50Hz。
1.频率分辨率的2种解释解释一:频率分辨率可以理解为在使用DFT时,在频率轴上的所能得到的最小频率间隔f0=fs/N=1/NTs=1/T,其中N为采样点数,fs为采样频率,Ts为采样间隔。
所以NTs就是采样前模拟信号的时间长度T,所以信号长度越长,频率分辨率越好。
是不是采样点数越多,频率分辨力提高了呢?其实不是的,因为一段数据拿来就确定了时间T,注意:f0=1/T,而T=NTs,增加N必然减小Ts ,因此,增加N时f0是不变的。
只有增加点数的同时导致增加了数据长度T才能使分辨率越好。
还有容易搞混的一点,我们在做DFT时,常常在有效数据后面补零达到对频谱做某种改善的目的,我们常常认为这是增加了N,从而使频率分辨率变好了,其实不是这样的,补零并没有增加有效数据的长度,仍然为T。
但是补零其实有其他好处:1.使数据N为2的整次幂,便于使用FFT。
2.补零后,其实是对DFT结果做了插值,克服“栅栏”效应,使谱外观平滑化;我把“栅栏”效应形象理解为,就像站在栅栏旁边透过栅栏看外面风景,肯定有被栅栏挡住比较多风景,此时就可能漏掉较大频域分量,但是补零以后,相当于你站远了,改变了栅栏密度,风景就看的越来越清楚了。
3.由于对时域数据的截短必然造成频谱泄露,因此在频谱中可能出现难以辨认的谱峰,补零在一定程度上能消除这种现象。
那么选择DFT时N参数要注意:1.由采样定理:fs>=2fh,2.频率分辨率:f0=fs/N,所以一般情况给定了fh和f0时也就限制了N范围:N>=fs/f0。
解释二:频率分辨率也可以理解为某一个算法(比如功率谱估计方法)将原信号中的两个靠得很近的谱峰依然能保持分开的能力。
这是用来比较和检验不同算法性能好坏的指标。
在信号系统中我们知道,宽度为N的矩形脉冲,它的频域图形为sinc函数,两个一阶零点之间的宽度为4π/N。
由于时域信号的截短相当于时域信号乘了一个矩形窗函数,那么该信号的频域就等同卷积了一个sinc函数,也就是频域受到sinc函数的调制了,根据卷积的性质,因此两个信号圆周频率之差W0必须大于4π/N。
傅里叶变换补零的影响
傅里叶变换中的"补零"指的是在时域信号上添加零值,以扩展信号的长度。
这种操作会对频域表示产生影响,下面我将简要介绍补零对傅里叶变换的影响:
1. 频谱分辨率提高:补零会使得频域中的频谱分辨率提高。
因为在时域上添加零值会增加信号的观测窗口,使得对频率更精细的分辨。
2. 频谱图的插值:补零会在频域上对频谱图进行插值,使得频谱图在频率轴上更加平滑。
3. 频谱零点的改变:补零会改变频谱中的零点位置,这可能会对信号的相位产生影响。
4. 主瓣宽度变窄:在一定条件下,补零可能会导致频域中主瓣的宽度变窄,从而提高频域表示的分辨率。
需要注意的是,补零并不会改变信号的能量分布,而只是对频域表示进行了调整。
在实际应用中,补零常常用于对信号进行频域分析时,以提高频域表示的精度和分辨率。
在MATLAB 中,进行傅里叶变换时可以使用补零操作,具体可以通过fft 函数的参数来实现。
例如,可以使用fft(x, N) 对长度为N 的信号x 进行傅里叶变换,并在计算前补零到长度为N 的信号。
补零与离散傅⾥叶变换的分辨率离散傅⾥叶变换(DFT)的输⼊是⼀组离散的值,输出同样是⼀组离散的值。
在输⼊信号⽽⾔,相邻两个采样点的间隔为采样时间Ts。
在输出信号⽽⾔,相邻两个采样点的间隔为频率分辨率fs/N,其中fs为采样频率,其⼤⼩等于1/Ts,N为输⼊信号的采样点数。
这也就是说,DFT 的频域分辨率不仅与采样频率有关,也与信号的采样点数有关。
那么,如果保持输⼊信号长度不变,但却对输⼊信号进⾏补零,增加DFT的点数,此时的分辨率是变还是不变?答案是此时分辨率不变。
从时域来看,假定要把频率相差很⼩的两个信号区分开来,直观上理解,⾄少要保证两个信号在时域上相差⼀个完整的周期,也即是相位相差2*pi。
举个例⼦,假定采样频率为1Hz,要将周期为10s的正弦信号和周期为11s的正弦信号区分开来,那么信号⾄少要持续110s,两个信号才能相差⼀个周期,此时周期为10s的那个信号经历的周期数为11,⽽11s的那个信号经历的周期书为10。
转化到频域,这种情况下,时域采样点为110,分辨率为1/110=0.00909,恰好等于两个信号频率只差(1/10-1/11)。
如果两个信号在时域上不满⾜“相差⼀个完整周期“的话,补零同样也不能满⾜“相差⼀个完整周期”,即分辨率不发⽣变化。
另外,从信息论的⾓度,也很好理解,对输⼊信号补零并没有增加输⼊信号的信息,因此分辨率不会发⽣变化。
那么,补零到底会带来什么样的影响呢?因为DFT可以看做是对DTFT的采样,补零仅是减⼩了频域采样的间隔。
这样有利于克服由于栅栏效应带来的有些频谱泄露的问题。
也就是说,补零可以使信号能在频域被更细致地观察。
如果不满⾜上述“⾄少相差⼀个完整周期”的要求,即便是如DTFT⼀般在频域连续,也⽆法分辨出两个信号。
那么,影响DFT分辨率最本质的物理机制是什么呢?在于DFT的积累时间,分辨率为积累时间T的倒数。
这点从数学公式上可以很容易得到:fs/N=1/(N*Ts)=1/T举个例⼦说,如果输⼊信号的时长为10s,那么⽆论采样频率为多少,当然前提是要满⾜奈奎斯特定理,其分辨率为1/10=0.1Hz。
2010年11月2日关于频谱泄漏2010-11-02 22:48(分类:学习)老板说我设计的DDC的最后出来的频谱有旁瓣,让人看上去不是单一正弦信号。
于是,开始找原因了。
结果发现是无限连续信号在进行DFT时,由于截取效应所产生的频谱泄露。
解决方案:1)加个窗函数。
于是,我加上了hamming窗,旁瓣是消息了,但是加窗相当于加了个滤波器,对最后的指标估计有影响。
2)用连续傅里叶变换来做频谱。
这个方法没怎么尝试,原因是matlab中,fourier()这个函数不会用。
等有空的时候再学习下吧。
3)修改采样点数,其实修改的是采样时间,但采样频率定下来,所以两者相当于等价了。
修改采样点数被采样频率整除。
今天的经历让我重视了采样点数这个参量。
以前老是忽视它,之前,滤波出来的是方波,还以为程序设计错误了,结果是采样点太少了。
所以么,以后思维不能太窄,多想想,多试试。
明天争取解决,滤波器组系数级联问题。
PS:在实际问题中遇到的离散时间序列x(n)通常是无限长序列,因而处理这个序列的时候需要将它截短。
截短相当于将序列乘以窗函数w(n)。
根据频域卷积定理,时域中x(n)和w(n)相乘对应于频域中它们的离散傅立叶变换X(jw)和W(jw)的卷积。
因此,x(n)截矩后的频谱不同于它以前的频谱。
为了减小频谱“泄露”的影响,往往在FFT处理中采用加权技术,典型的加权序列有Hanning、Blackman、Gaussian 等窗序列。
此外,增加窗序列的长度也可以减少频谱“泄露”。
小说几句。
时域上乘上窗函数,相当对于频率为fs的正弦序列,它的频谱应该只是在fs处有离散谱。
但是,在利用DFT求它的频谱做了截短,结果使信号的频谱不只是在fs处有离散谱,而是在以fs为中心的频带范围内都有谱线出现,它们可以理解为是从fs频率上“泄露”出去的,这种现象称为频谱“泄露”。
于频域进行卷积。
长度为无穷长的常数窗函数,频域为delta函数,卷积后的结果和原来一样。
关于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');原文连接:/ART_8800009929_400014_500012_TS.HTM原文简介:采用C语言程序处理FFT算法无能为力的扩大频谱的问题如果你只是对计算小频率范围上的频谱有兴趣,那HRFT可能比FF T更有效。
频率范围越窄,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Ω,我们可以利用下列公式计算每一个T n和U n。
现在我们只需要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Ω、U=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的吸引力就越大。
当必须利用有限的存储资源在嵌入式系统中执行运算时,这一点尤为明显。