我正在做一个 ICA 应用程序,目的是从混合信号观察中分离信号。理论上似乎是有效的,当我查看 numpy ndarray 中的 ICA 恢复信号时,信号清晰可见。但是,当我尝试将此 ndarray 写入 .wav 进行播放时,信号完全消失。从下图中可以很容易地看出这一点:
第一张图显示了 ICA 恢复信号的 numpy ndarray 信号。第二张图显示了我只是加载了据称由 scipy .wav write 编写的文件的位置,正如您所看到的,它是静默的。
这种行为令人费解,因为之前我使用完全相同的过程使用混合矩阵(也采用相同的格式,numpy ndarrays)生成混合信号观测值。在下图中,您会注意到一切都完全相同,但是,无论出于何种原因,scipy write .wav 工作 - 第二张图确实验证了信号是从 .wav 加载的。从第一个图(numpy nd 数组)写入的 wav。
我想知道这有条件成功的背后是什么。我知道 float 和整数需要小心处理,但我很确定我没有忽略任何事情。
图片解释得很好,我唯一想澄清的是 play_wav
函数正在做什么,它基本上只是写入 .wav 并创建一个音频对象:
def play_wav(file, fs, data):
wavfile.write(file, fs, data.astype(np.dtype('i2')))
display(Audio(filename=file))
进口:
import numpy as np
from scipy.io import wavfile
from IPython.display import display, Audio
from sklearn.decomposition import FastICA
最佳答案
看起来您尝试写入的数组包含 [-0.02, 0.02] 范围内的值。当您在将数组写入 WAV 文件之前将其转换为 16 位整数时,所有这些值都将被截断为零!
wavfile.write
支持 float32 数组,因此您可以完全跳过转换步骤。或者,在将数组转换为 int16 之前,将数组重新调整为 215 和 -215 之间,例如:
((data + data.min()) * (2 ** 15) / data.ptp()).astype(np.int16)
关于python - Scipy 写入音频问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39695645/