我正在阅读一本关于 DSP 的书,其中有一个关于研究穿过海洋的声音的示例。声音被记录为时域信号,他们试图在频域中对其进行分析。
输入信号被分成 256 个点段。这些段中的每一个都乘以汉明窗,然后通过 256 点 DFT。然后对得到的频谱进行平均以形成单个 129 点频谱。请看图
我不明白:
他们如何将输入信号分成 256 段?
每个段如何与汉明窗相乘?
他们如何计算 256 个 DFT 点?
频谱是如何平均的?
我正在阅读一本关于 DSP 的书,其中有一个关于研究穿过海洋的声音的示例。声音被记录为时域信号,他们试图在频域中对其进行分析。
输入信号被分成 256 个点段。这些段中的每一个都乘以汉明窗,然后通过 256 点 DFT。然后对得到的频谱进行平均以形成单个 129 点频谱。请看图
我不明白:
他们如何将输入信号分成 256 段?
每个段如何与汉明窗相乘?
他们如何计算 256 个 DFT 点?
频谱是如何平均的?
他们如何将输入信号分成 256 段?
这通常是通过滑动一个给定宽度(这里是 256)的窗口来完成的。根据步长,这会导致重叠(如果小于 256)或不重叠(如果等于或大于 256)数据段。
每个段如何与汉明窗相乘?
通常,通过逐元素乘法。
他们如何计算 256 个 DFT 点?
如果我没记错的话,DFT 点的数量是由输入信号的长度决定的。
频谱是如何平均的?
将所有得到的光谱相加并除以光谱数。
代码可能看起来像这样(假设您只对频谱的幅度信息感兴趣):
clear all;
clc;
input_signal = sin(2*pi*.2*[1:256*1024]).'; %sine at frequency .2 (n=51.2)'
for idx = 1:length(input_signal)/256
%take a slice from the input vector
slice = input_signal(1+(idx-1)*256:idx*256);
%multiply it with the window and transform it into frequency domain
spectrum = fft(slice.*hamming(256));
%get the spectrum magnitude at each of the 256 frequency points and store it
mag_spectrum(:,idx) = abs(spectrum).^2;
end
%for each frequency, take the mean value of the magnitude (mean along rows, thus the .')
mean_spectrum = mean(mag_spectrum.');
之后,向量 mean_spectrum 包含正频率和负频率(索引 2..128 处的正频率,索引 129..256 处的负频率(-fs/2 首先!),索引 1 处的 DC)。因此,我假设长度为 128 的输出向量平均正负频率。您可以通过以下方式获得:
output_vec(1) = mag_spectrum(1);
output_vec(2:128) = 1/2*(mag_spectrum(2:128)+mag_spectrum(256:-1:130));
output_vec(129) = mag_spectrum(129);
plot(output_vec);
这导致光谱中的峰值大约在。n = 52,正如预期的那样。如果要随时间跟踪信号的频率分量,则可以改用短时傅里叶变换。