由于运算方式和存储容量的限制,计算机只能处理离散且有限长的数据,故“不得不”将无限长的采样序列在时域截断,再进行后续处理。由数据在时域截断引起失真。
分析余弦序列 x ( n ) = cos ( ω 0 n ) x(n) = \cos(\omega_0 n) x(n)=cos(ω0n)在时域截断前后频谱的变化规律。
对于无限长的余弦序列,其频谱为:
X ( e j ω ) = π ∑ k = − ∞ ∞ [ δ ( ω + ω 0 + 2 k π ) + δ ( ω − ω 0 + 2 k π ) ] X(e^{j\omega}) = \pi \sum_{k=-\infty}^{\infty} \left[ \delta(\omega + \omega_0 + 2k\pi) + \delta(\omega - \omega_0 + 2k\pi) \right] X(ejω)=πk=−∞∑∞[δ(ω+ω0+2kπ)+δ(ω−ω0+2kπ)]
现用矩形窗对余弦序列进行时域截断,得到 x N ( n ) = cos ( ω 0 n ) R N ( n ) x_N(n) = \cos(\omega_0 n) R_N(n) xN(n)=cos(ω0n)RN(n), R N ( n ) R_N(n) RN(n)为 N N N点矩形窗函数。根据频域卷积定理可知,时域相乘对应频域的卷积运算,即:
X N ( e j ω ) = 1 2 π X ( e j ω ) ∗ W N ( e j ω ) X_N(e^{j\omega}) = \frac{1}{2\pi} X(e^{j\omega}) * W_N(e^{j\omega}) XN(ejω)=2π1X(ejω)∗WN(ejω)
根据例 3.2 的结论可知,N 点矩形序列的 DTFT 结果为:
W N ( e j ω ) = 1 − e − j ω N 1 − e − j ω = e − j ω N − 1 2 sin ( ω N / 2 ) sin ( ω / 2 ) W_N(e^{j\omega}) = \frac{1 - e^{-j\omega N}}{1 - e^{-j\omega}} = e^{-j\omega \frac{N-1}{2}} \frac{\sin(\omega N / 2)}{\sin(\omega / 2)} WN(ejω)=1−e−jω1−e−jωN=e−jω2N−1sin(ω/2)sin(ωN/2)
余弦信号的频谱为冲激函数串,在此仅考虑 [ − π , π ] [-π, π] [−π,π]区间正频率的 DTFT 结果,可得:
X N ( e j ω ) = 1 2 W N ( e j ( ω − ω 0 ) ) = 1 2 1 − e − j ( ω − ω 0 ) N 1 − e − j ( ω − ω 0 ) X_N(e^{j\omega}) = \frac{1}{2} W_N(e^{j(\omega - \omega_0)}) = \frac{1}{2} \frac{1 - e^{-j(\omega - \omega_0) N}}{1 - e^{-j(\omega - \omega_0)}} XN(ejω)=21WN(ej(ω−ω0))=211−e−j(ω−ω0)1−e−j(ω−ω0)N
余弦函数的连续傅里叶变换式冲激对。
频率分辨率指能区分的最小频率间隔。
示例
两个具有接近频率的复指数信号,频率分别为 F 1 = 10 F_1 = 10 F1=10Hz 和 F 2 = 12 F_2 = 12 F2=12Hz,采样间隔为 T = 0.02 T = 0.02 T=0.02秒。考虑不同数据长度 L = 10 , 15 , 30 , 100 L = 10, 15, 30, 100 L=10,15,30,100,并进行零填充到 512 点。
N = 10 N = 10 N=10
DFT 使用 N = 10 N = 10 N=10并进行零填充到 512 点。未分辨: F 2 − F 1 = 2 F_2 - F_1 = 2 F2−F1=2Hz < 1 / ( N T ) = 5 < 1/(NT) = 5 <1/(NT)=5Hz。
-
N = 10 N = 10 N=10: 数据长度为 10。
-
零填充到 512 点: 将数据长度扩展到 512 点。
-
未分辨: 两个频率 F 1 F_1 F1和 F 2 F_2 F2之间的差值为 2 Hz,小于频率分辨率 1 / ( N T ) 1/(NT) 1/(NT),即 5 Hz。因此,这两个频率在 DFT 中无法分辨。
### N = 15 N = 15 N=15
DFT 使用 N = 15 N = 15 N=15并进行零填充到 512 点。未分辨: F 2 − F 1 = 2 F_2 - F_1 = 2 F2−F1=2Hz < 1 / ( N T ) ≈ 3.3 < 1/(NT) \approx 3.3 <1/(NT)≈3.3Hz。 -
N = 15 N = 15 N=15: 数据长度为 15。
-
零填充到 512 点: 将数据长度扩展到 512 点。
-
未分辨: 两个频率 F 1 F_1 F1和 F 2 F_2 F2之间的差值为 2 Hz,小于频率分辨率 1 / ( N T ) 1/(NT) 1/(NT),即约 3.3 Hz。因此,这两个频率在 DFT 中无法分辨。
N = 30 N = 30 N=30
DFT 使用 N = 30 N = 30 N=30并进行零填充到 512 点。分辨: F 2 − F 1 = 2 F_2 - F_1 = 2 F2−F1=2Hz > 1 / ( N T ) ≈ 1.7 > 1/(NT) \approx 1.7 >1/(NT)≈1.7Hz。
- N = 30 N = 30 N=30: 数据长度为 30。
- 零填充到 512 点: 将数据长度扩展到 512 点。
- 分辨: 两个频率 F 1 F_1 F1和 F 2 F_2 F2之间的差值为 2 Hz,大于频率分辨率 1 / ( N T ) 1/(NT) 1/(NT),即约 1.7 Hz。因此,这两个频率在 DFT 中可以分辨。
N = 100 N = 100 N=100
DFT 使用 N = 100 N = 100 N=100并进行零填充到 512 点。分辨: F 2 − F 1 = 2 F_2 - F_1 = 2 F2−F1=2Hz > 1 / ( N T ) = 0.5 > 1/(NT) = 0.5 >1/(NT)=0.5Hz。
- N = 100 N = 100 N=100: 数据长度为 100。
- 零填充到 512 点: 将数据长度扩展到 512 点。
- 分辨: 两个频率 F 1 F_1 F1和 F 2 F_2 F2之间的差值为 2 Hz,大于频率分辨率 1 / ( N T ) 1/(NT) 1/(NT),即 0.5 Hz。因此,这两个频率在 DFT 中可以分辨。
% 参数设置
F1 = 10; % 第一个频率 (Hz)
F2 = 12; % 第二个频率 (Hz)
T = 0.02; % 采样间隔 (秒)
Fs = 1/T; % 采样频率 (Hz)
signal_length = [10, 15, 30, 100]; % 不同的数据长度
N = 512; % 512点
% 生成时间向量
t = 0:T:(signal_length(end)*T - T);
% 生成信号
signal = exp(1i*2*pi*F1*t) + exp(1i*2*pi*F2*t);
%%
% 计算DFT并绘制
figure;
for L = signal_length
% 选择前N个点
signal_N = signal(1:L);
% 计算DFT
X = fft(signal_N,N);
% 计算频率轴
f = Fs*(0:N-1)/N;
% 绘制DFT
subplot(2, 2, vec2ind((signal_length == L)'));
plot(f, abs(X));
xlim([0,50])
grid on
title(['N = ', num2str(L)]);
xlabel('Frequency (Hz)');
ylabel('Magnitude');
end