mag_frames = np.abs(fft_frames)
时间: 2023-12-06 21:05:40 浏览: 36
这行代码从所有帧的频域表示 `fft_frames` 中提取了振幅信息,并将其存储在 `mag_frames` 变量中。具体来说,这个代码使用了 `numpy` 库中的 `abs` 函数,该函数返回一个数组,其中每个元素都是对应元素的绝对值。在这里,由于 `fft_frames` 中每个元素都是一个复数,因此 `np.abs(fft_frames)` 返回的数组中每个元素都是对应元素的振幅值。这个操作通常被称为取模(modulus)或者幅度谱(magnitude spectrum)。
相关问题
所以我只需要将adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed[:, np.newaxis] * freqs[np.newaxis, :])这段代码替换成pitch_freqs_smoothed = pitch_freqs_smoothed[:, np.newaxis]pitch_freqs_smoothed = np.tile(pitch_freqs_smoothed, (1, mag_frames.shape[1]))adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed * freqs[np.newaxis, :])就行了吗
是的,你可以将原来的代码替换为新的代码,但是需要注意一下 `freqs` 数组的长度是否正确,以确保可以正确进行广播操作。同时,也需要确保 `pitch_freqs_smoothed` 被正确地转换为 `(198, 882)` 的形状。
完整的代码修改如下:
```
freqs = np.fft.rfftfreq(n_fft, d=1.0/sr)
pitch_freqs_smoothed = pitch_freqs_smoothed[:, np.newaxis]
pitch_freqs_smoothed = np.tile(pitch_freqs_smoothed, (1, mag_frames.shape[1]))
adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed * freqs[np.newaxis, :])
```
这个修改后的代码会将 `pitch_freqs_smoothed` 转换为一个形状为 `(198, 882)` 的数组,然后使用广播机制将其与 `freqs` 相乘,得到一个形状为 `(198, 882)` 的新的振幅谱矩阵 `adjusted_fft_frames`。
结合之前几段代码,解释adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed[:, np.newaxis]* freqs[np.newaxis, :])
在这段代码中,首先使用了之前处理得到的pitch_freqs_smoothed数组,这个数组包含了每一帧的基频对应的频率,然后使用了numpy的广播机制,将其转化为一个二维数组,其中每一行都是pitch_freqs_smoothed数组。另外,使用了freqs数组,这个数组包含了每一个FFT bin的分辨率,即每个bin对应的频率值,它是一个一维数组。
接下来,对于每一帧,在每个FFT bin的位置上,乘以一个复数值,这个复数值的实部是1,虚部是2π乘以相应的频率值,这个频率值是pitch_freqs_smoothed数组中对应帧的值。这个复数可以看作是一个旋转因子,它的幅度为1,相位随着频率的变化而变化,这个过程可以看作是在对FFT frame做频率变换。最后,将经过变换的FFT frame乘以mag_frames,这个mag_frames是之前计算得到的原始FFT frame的幅度信息,这样可以得到经过调整的FFT frame,其中包含了音高的信息。