python - Scipy 写入音频问题

标签 python audio scipy scikit-learn signal-processing

我正在做一个 ICA 应用程序,目的是从混合信号观察中分离信号。理论上似乎是有效的,当我查看 numpy ndarray 中的 ICA 恢复信号时,信号清晰可见。但是,当我尝试将此 ndarray 写入 .wav 进行播放时,信号完全消失。从下图中可以很容易地看出这一点: enter image description here

第一张图显示了 ICA 恢复信号的 numpy ndarray 信号。第二张图显示了我只是加载了据称由 scipy .wav write 编写的文件的位置,正如您所看到的,它是静默的。

这种行为令人费解,因为之前我使用完全相同的过程使用混合矩阵(也采用相同的格式,numpy ndarrays)生成混合信号观测值。在下图中,您会注意到一切都完全相同,但是,无论出于何种原因,scipy write .wav 工作 - 第二张图确实验证了信号是从 .wav 加载的。从第一个图(numpy nd 数组)写入的 wav。

enter image description here

我想知道这有条件成功的背后是什么。我知道 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/

相关文章:

python - 为什么函数标签在该函数的范围内,但类方法标签不在其自身范围内?

android - 适用于 Android 的低级音频 API

java - 在 Android 上查找音高

python - Python 中的多维欧氏距离

python - Python 中相当基本的字符串扩展?

python - 为什么 Python argparse 中的 fromfile-prefix-chars 不起作用?

python - python对不规则(x,y,z)网格的4D插值

python - 将函数应用于 pandas dataframe 并获得不同大小的 ndarray 输出

python - 使用 gunicorn 服务时 flask 超时

objective-c - AVAudioPlayer audioPlayerDidFinishPlaying :successfully: not called