频域分析原理
频域分析最被大众所熟知的可能是卡拉OK的音频频谱显示,这里贴一个来自AVR单片机的项目 ,其中就用到了FFT来对语音信号进行分析:
视频中横坐标为频率,纵坐标为功率,而且能够实时的反映出语音的频谱。
FFT是DFT(离散傅里叶变换)的加速算法,最早是由Cooley和Tukey在1965年提出 ,这里面用了很多的技巧,其方向是如何减小计算过程中所需要的乘法运算,另外FFT一次可以计算N个点,而且随着N的增大,FFT优势就会非常明显。DFT复杂度(按乘法数量来计算)是 ,而FFT复杂度是 ,参考 .
这里简单的理解下DFT,假设我们有一个待测数字序列A(A序列是以fs采样的N点信号,采样间隔为ts),假设此序列中暗含一个频率为fa的正弦波信号,但是此暗含的信号幅度和相位我们并不知道是多少,现在我们的目标是求出此信号的的幅度和相位信息。
我们可以使用信号相关来解决此问题 ,构造2个频率均为fa,幅度均为1的正弦和余弦序列B和C,然后用这两个序列分别和A序列相乘,然后滤波,最后输出的两个信号就可以求出幅度和相位,假设A序列中含有非fa频率的信号,相乘滤波后幅度为0,表示此序列中的非fa频率信号都将被滤除,最后结果就只有和fa频率相关信号被保留下来。
使用公式描述即:
A信号序列为:
B信号序列为:
C信号序列为:
则两个输出且滤波(信号求平均)后的结果是:
通过这两个信号就可以求出X[i]中所含fa信号的幅度和相位:
式中,当i=N时,正弦信号和余弦信号相位需要是 的整数倍,这样滤波器刚刚好将其他频率的信号完全滤除掉,也就是说不会出现频谱泄露,所以有: 将上式改写如下: 若进行N点的DFT计算,只要满足上式了,就可以保证在第k个频率点出现信号,而不会在DFT中出现频谱泄露问题。
程序验证
1%--------------------------------------------------------------------------
2% Edited by 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); % 计算FFT
17Amp = 2*abs(X)/Nfft; % 计算幅度
18Amp_log = 20*log10(Amp); % 幅度转换为dB
19f = 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('freq/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信号落在第二奈奎斯特区域。
-
单片机
+关注
关注
6036文章
44557浏览量
635115 -
AVR
+关注
关注
11文章
1123浏览量
78658 -
频域分析
+关注
关注
0文章
20浏览量
12735
发布评论请先 登录
相关推荐
评论