我的实际音频采样率为44.1kHz,在实际运行这段代码的过程中,报了operands could not be broadcast together with shapes(198,882)(198,442)的错误,我该怎么修改代码
时间: 2024-02-12 09:03:02 浏览: 21
这个错误是因为在计算频率变换的时候,pitch_freqs_smoothed和freqs数组的维度不匹配,导致无法进行广播。可以尝试将pitch_freqs_smoothed数组中的每个元素除以原始采样率(即44010),然后再进行上述计算,这样可以得到一个更小的数组,维度为(198,441),这个数组就可以顺利地与freqs数组进行广播了。具体修改代码如下:
```
pitch_freqs_smoothed = pitch_freqs_smoothed / 44010.0
adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed[:, np.newaxis] * freqs[np.newaxis, :])
```
需要注意的是,在这样修改代码的同时,也需要将之前计算pitch_freqs_smoothed的代码中的fs参数改为44100。
相关问题
我补充一下前一个提问,我的音频信号采样率为44.1kHz,在实际运行的过程中,报了“operands could not be broadcast together with shapes (198,882)(221,442)”我该怎么修改以上代码
由于你的音频信号采样率为44.1kHz,因此每帧的 FFT 频谱中包含的频率分量个数应该是 882,即采样率的一半。所以,需要将 `freqs` 数组的长度修改为 882,即修改为 `freqs = np.fft.rfftfreq(n_fft, d=1.0/sr)`。
同时,根据你的错误提示,`mag_frames` 的形状为 `(198, 882)`,`pitch_freqs_smoothed` 的形状为 `(221,)`,这两个数组的维度无法进行广播操作,所以需要将 `pitch_freqs_smoothed` 转换为 `(198, 882)` 的形状。具体来说,可以使用 `np.tile` 函数将 `pitch_freqs_smoothed` 沿着第二个维度复制 882 次,然后将其形状重塑为 `(198, 882)`。修改后的代码如下:
```
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` 就可以与 `mag_frames` 的第一维对应,与 `freqs` 的第二维进行广播操作,得到一个形状为 `(198, 882)` 的新的振幅谱矩阵 `adjusted_fft_frames`。
但我在实际运行的过程中,报了“operands could not be broadcast together with shapes (198,882)(221,442)”我该怎么修改以上代码
这个错误提示表明,两个数组的形状无法进行广播操作,因此无法进行逐元素相乘。具体来说,`mag_frames` 的形状应该是 `(198, 442)`,代表了198帧和442个频率分量,而`pitch_freqs_smoothed` 的形状应该是 `(198,)`,代表了198帧的基频频率。因此,需要将基频频率序列 `pitch_freqs_smoothed` 转换成一个二维数组,使得其能够在第二个维度上与 `freqs` 数组的形状 `(1, 442)` 进行广播操作。可以使用`np.newaxis`来增加 `pitch_freqs_smoothed` 的维度,即将其形状从 `(198,)` 变为 `(198, 1)`。修改后的代码如下:
```
adjusted_fft_frames = mag_frames * np.exp(1j * 2 * np.pi * pitch_freqs_smoothed[:, np.newaxis] * freqs[np.newaxis, :])
```
这样,`pitch_freqs_smoothed` 的第一维就可以与 `mag_frames` 的第一维对应,第二维可以与 `freqs` 的第二维进行广播操作,从而得到一个形状为 `(198, 442)` 的新的振幅谱矩阵 `adjusted_fft_frames`。