我正在尝试通过 Matlab 中的 FFT 累加法(FAM)来估计谱相关函数。我理解 FAM 方法的方式是这个链接(参见第 6 页和第 7 页的 FAM 教程)。
这是再次总结该过程的图像:
我将在下面总结我是如何理解这种方法的:
- 获取
size = N
数据点的数据块。 - 让用户输入所需的频率分辨率 (
d_f
) 和所需的 alpha 分辨率 (d_alpha
)。 - 从
d_f
和d_alpha
,计算以下参数。N' = fs/d_f;
fs
是输入信号的采样频率。N'
原来是 STFT FFT 大小。L = N'/4
,其中 L 是 STFT 跳过(参见链接中的图表)。P = fs/(L*d_a),这是平滑 FFT 大小.. 最后N = P*L
,N
是我们要处理的数据点的总数。N
应该是 nextpow2 > 输入大小并在必要时填充零。
我有代码将数据分块成N'
数据点段,为每个块执行窗口化,计算每个块的 FFT,并执行降档到基带。我将复杂的基带存储到一个称为 XD 的矩阵中。XD 的维度是:N'
rows X P
cols,其中每个 col 代表一个块的 STFT。然后,我执行以下操作:
XD = conj(XD'); % now dim(XD) = P x N'.
我们这样做 b/c FFT 对 matlab 中的矩阵中的列进行操作。
我在 FAM 方法中感到困惑的步骤是 X 与其复共轭相乘,使用 P 点 FFT 执行时间平滑,然后输出 SCF。
要使用复共轭执行乘法,我执行以下操作:
% Np = N' (in code).
XM = zeros(P, Np^2);
for k=1:Np
for l=1:Np
XM(:,(k-1)*Np+l) = (XD(:,k).*conj(XD(:,1)));
end
end
本质上,此操作是创建一个维度为P
x的矩阵 XM (N')^2
。在此之后,我在 XM 上进行 FFT
XM2 = fft(XM);
现在我该怎么办?我必须从 XM2 中选择某些值作为我的 SCF 估计值,但对如何执行此操作感到困惑?XM 中的每一行都包含不同频率区间之间的频谱相关性。因此,例如,XM 的第 1 列包含 bin1 与 bin1 的光谱相关性,col 2 包含 bin1 与的光谱相关性bin2
,colN'
包含 bin1 与 之间的光谱相关性bin-N'
,colN'+1
包含与 之间的光谱相关性bin2
,bin1
等等……也就是说XM 的尺寸为P
x的原因(N')^2
。
我很困惑我需要选择哪些点来创建我的 SCF 估计。我基本上需要弄清楚 XM 的哪些元素对应于某个 alpha 和 freq 值,但我不知道该怎么做。
先谢谢了,新年快乐!