Python scipy wav音频反褶积NaN

2024-09-30 14:30:59 发布

您现在位置:Python中文网/ 问答频道 /正文

最近几天我一直在玩scipy音频。 下面的代码的工作原理是它需要一个音频文件和一个脉冲响应。然后应用卷积并保存文件。到现在为止,一直都还不错。在

重新导入文件并对其应用反褶积时,重新生成初始文件。它仍然完美地工作。在

但是, 当任何其他文件被传递到反褶积函数时,返回的数组包含大量NaN和0

即使我加载文件并通过卷积函数运行它,脉冲响应只有一个1(扁平滤波器)。为了得到一个经过相同过程的文件。在

在反褶积后尝试将文件写入磁盘时,具有NaN和0的数组最终以错误结束。在

有什么想法吗?提示?在

这是我的第一个新的即时通讯编码。请温柔一点。在

import scipy
import numpy as np
import librosa
from scipy import signal


def main():
    #samplerate
    sr = 44100
    #file path
    dryFile = "/Users/davidhefti/Dropbox/DPsync/dh prog/python/thinkDsp2.0/audio2/original2_01.wav"
    irFile = "/Users/davidhefti/Dropbox/DPsync/dh prog/python/thinkDsp2.0/audio2/IR2_01.wav"
    convolutionOut = "/Users/davidhefti/Dropbox/DPsync/dh prog/python/thinkDsp2.0/dump/convolved1.wav"
    filtered = "/Users/davidhefti/Dropbox/DPsync/dh prog/python/thinkDsp2.0/dump/convolved1.wav"
    deConvolutionOut = "/Users/davidhefti/Dropbox/DPsync/dh prog/python/thinkDsp2.0/dump/DEconvolved1.wav"

    do_Convolution(dryFile, irFile, convolutionOut, sr)

    do_Deconvolution(filtered, irFile, deConvolutionOut, sr)


"""FUNCTIONS"""

def print_properties(name, array):
    print("Name {}".format(name))
    print("Shape: {}".format(array.shape))
    print("Type: {}".format(array.dtype))
    print("Min Value: {}".format(array.min()))
    print("Max Value: {}".format(array.max()))
    print()


def do_Convolution(sourcePath, irPath, outPath, samplerate):
    """load INFILE 1"""
    source, sSR = librosa.load(sourcePath, sr=samplerate)
    source64 = source.astype(np.float64)
    print_properties("input file before convolution", source64)

    """load IR"""
    ir, irSR = librosa.load(irPath, sr=samplerate)
    ir64 = ir.astype(np.float64)
    print_properties("Impulse response", ir64)

    """CONVOLVE AND WRITE 64bit"""
    convolve = signal.convolve(source64, ir64)
    print_properties("CONVOLUTION", convolve)
    librosa.output.write_wav(outPath, convolve, sr=samplerate)


def do_Deconvolution(sourcePath, irPath, outPath, samplerate):
    """load convolutioned file NEEDS TO BE 64 BIT MONO?"""
    relSR, reloaded = scipy.io.wavfile.read(sourcePath)
    print_properties("reloaded", reloaded)

    """Load IR"""
    ir, irSR = librosa.load(irPath, sr=samplerate)

    """DECONVOLVE"""
    deconvolve, remainder = signal.deconvolve(reloaded, ir)
    print_properties("DECONVOLUTION", deconvolve)
    librosa.output.write_wav(outPath, deconvolve, samplerate)


if __name__ == "__main__":
    main()

Tags: 文件loadpropertiesarrayusersdropboxdhprint