首页>>科技 >>内容

fft算法的基本原理简述,FFT原理解析

发布时间:2023-07-27 12:26:17编辑:温柔的背包来源:

很多朋友对fft算法的基本原理简述,FFT原理解析不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

fft算法的基本原理简述,FFT原理解析

频域分析的原理频域分析可能是卡拉OK中最著名的音频频谱显示。下面是AVR单片机的一个项目,使用FFT来分析语音信号:

视频中横坐标是频率,纵坐标是功率,可以实时反映语音的频谱。

FFT是DFT(离散傅立叶变换)的加速算法。它是由Cooley和Tukey在1965年首次提出的,其中使用了很多技术。方向是如何减少计算过程中需要的乘法运算。另外,FFT一次可以计算N个点,随着N的增加,FFT的优势就会非常明显。 DFT 复杂度(由乘法次数计算)为,FFT 复杂度为,参见。

这里简单理解一下DFT,假设我们有一个待测试的数字序列A(A序列是fs采样的N点信号,采样间隔为ts),假设这个序列隐含着一个正弦波信号频率为fa,但是我们不知道隐含信号的幅度和相位。现在我们的目标是找到该信号的幅度和相位信息。

我们可以利用信号相关性来解决这个问题,构造两个频率为fa、幅度为1的正弦和余弦序列B和C,然后用这两个序列分别与A序列相乘,然后进行滤波,最后输出幅度和相位可以从两个信号获得。假设A序列中包含非fa频率信号,则相乘滤波后的幅度为0,这意味着该序列中的所有非fa频率信号都会被滤除,最终的结果只是和与fa频率相关信号被保留。

用公式来描述就是:

信号序列为:

B信号序列为:

C信号序列为:

那么两次输出并滤波(信号平均)的结果为:

通过这两个信号,可以得到X[i]中包含的fa信号的幅度和相位:

式中,当i=N时,正弦信号和余弦信号的相位需要为的整数倍,这样滤波器才能够完全滤除其他频率的信号,也就是说不会有频谱泄漏,所以有: 将公式改写为: 如果进行N个点的DFT计算,只要满足上式,就可以保证第k个频率点的信号,频谱泄漏问题就不会出现在DFT 中不会出现。

程序验证1% ---------------------------------------------------------- ---------------------------- 2% 由bbl 编辑3% Date: 2021-10-31(yyyy-mm-dd) 4% FFT计算5%-------------------------------------------------------- ---------------------------- 6fa=200.1953125e6; % 信号频率,无频谱混叠7% fa=200e6; % 信号频率,发生频谱混叠8A0=1; % 信号幅度9fs=1e9; %采样率10Nfft=1024; % FFT 点数11wa=2*pi*fa;12ts=1/fs;13t=0:ts:ts*(Nfft-1) ; % 构造时间序列14Vn=1e-3*randn(1,Nfft); % 构造噪声15y=A0*sin(wa*t)+Vn; % 构造信号序列,添加噪声以便于观察16X=fft(y, Nfft); %计算FFT17Amp=2*abs(X)/Nfft; %计算幅度18Amp_log=20*log10(Amp); % 将幅度转换为dB19f=linspace(0, fs/2, Nfft/2+1)*1e -6;20plot(f, Amp_log(1:Nfft/2+1), '-r', 'LineWidth', 1); 21grid on;22ylim([-100,10]);23ylabel('Amp/dBFS'); 24xlabel('频率/MHz');25title(sprintf('FFT, fs=%0.2fM Hz, fa=%0.8fM Hz', fs*1e-6,fa*1e-6));仿真结果:

如果将fa 修改为200.1953125M,您将得到:

波形正常。

如果将fa 修改为200.0000000M,则会得到:

出现光谱混叠。

小程序实现电路设计小工具实现了fa值的计算,使得FFT计算过程中不会出现频谱泄漏。当然,也可以根据给定的输出频率计算出最接近的不存在频谱泄漏问题的频率点。本例中输入200MHz即可查看最接近200MHz且无频谱泄漏的频点:

还可以计算Bin 内的频率带宽:

当然,这个小程序可以显示当前信号属于哪个奈奎斯特区域:

指示fa 信号落在第二奈奎斯特区。

以上知识分享希望能够帮助到大家!