我正在尝试了解 PSD,以及它的功能。
到目前为止,我已经执行了以下操作:
NFFT = 256用和分割信号hop_size = 128- 对这些段中的每一个进行窗口化(汉明)
- 每个窗口的 DFT
- 取结果矩阵的前半部分
(n/2+1)
从我目前所阅读的内容来看,该算法可以最好地描述如下:
我们取 LENGTH 的平方大小NFFT,我们通过以下方式计算mag = (bin.re * bin.re + bin.im * bin.im):这给出了 DFT bin 中每个点的大小。
Q1:这些是“平均”形成Pxx Pxx的,是我假设存储平均值的大小的 bin NFFT/2+1,但是,这些存储每个 bin 的平均值吗?因为不太明白:
如果我有一个包含值的二维矩阵:
a = [[1, 2, 3, 4, 5, 6, 9, 8],
[2, 5, 8, 9, 7, 8, 9, 7],
[4, 5, 6, 4, 7, 8, 9, 8]
然后我取这些的“平均值”.. 即 (1+2 ....., n)/NFFT/2+1。对于每个垃圾箱,这只会给出一个值?
好的,现在进入缩放。因此,我们可以扩展到频率吗?如果是这样,我们是否按比例缩放Fs * window_size
编辑:
我认为我的最后一个问题没有那么有意义..
到目前为止,我有一个包含146x128..
block1 = [1, 2, 3, ...... n] (where `n` is 128)
block2 = [0, 5, 6, ...... n]
.....
block146 = [1, 4, 5, .... n]
现在,如果我计算每个块的平均幅度,即sum(sqrt(re*re+im*im))/128这将为我提供每个块的平均值(包含 146 个样本的向量)。
对于我的每个样本,blocks我是否因此将每个样本除以该特定块的平均幅度?IE
block1 = [0, 1, 2, ...... n]
average = (0+1+2)/128 = 0.58 (for example)
result = [0/0.58, 1/0.58, 2/0.58.... n]
因此,我得到的向量仍然是二维向量。
这有意义吗?
编辑:
1 - 你想处理什么类型的信号?即:它是什么类型的应用程序?它是一维信号吗,例如以 44.1Khz 采样的音频?还是像图像或视频这样的多维信号?
我正在尝试处理音频信号。
到目前为止我所做的是:
采用一维输入向量,然后将该向量拆分为块(大小256与此重叠/跳跃128给我总共 146 个块,每个块包含 128 个样本。这些样本已乘以汉明窗,然后 DFT 有被通过了。
这些块包含窗口化和 DFT 发生后的结果值。
2 - 你在哪里进行这些计算?Matlab、Octave、python 还是其他?
我正在使用 C++ 执行这些计算
3 - 当您说 2D 向量(称其为矩阵可能会更容易混淆)时,里面的数字是什么意思?什么是列,什么是行?
列和行包含每个块的汉宁窗的 DFT 结果256/2 = 128
本质上,我试图做的是创建一个频谱图。目前,我可以用值的幅度绘制频谱图,即(re*re+im*im),我想绘制整体功率谱(PSD),而不是绘制幅度,以便我可以确定功率主要在信号内的位置。
如果我这样做,matplotlib我可以得到以下结果:

所以理论上,magnitudes我不想显示我目前正在做的事情,而是想显示 PSD(如图所示)。我查看了 matplotlib 源代码,这是给出的:
result, windowVals = apply_window(result, window, axis=0,
return_window=True)
result = np.fft.fft(result, n=pad_to, axis=0)[:numFreqs, :]
result = np.conjugate(result) * result
# for PSD
result /= (np.abs(windowVals)**2).sum()
result[1:-1] *= scaling_factor
# where scaling_factor is either 1 or 2
对我来说,上面的代码看起来像是取 WindowValues 的平方和(即 Hamming),然后将每个值除以result(即生成的 DFT),最后乘以比例因子。
这看起来正确吗?