0

我发现使用soundfile和读取 wav 文件之间的幅度响应存在问题wavefile。以下是不同的情节:

在此处输入图像描述

你能告诉我我需要调整什么wavefile.read才能获得与 相同的幅度soundfile.read吗?

这是我使用的代码:

import os
import matplotlib.pyplot as plt
from matplotlib import transforms
import numpy as np
import soundfile as sf

import scipy.io.wavfile as wavfile

from matplotlib.gridspec import GridSpec

input_file1 = (r'G:/file.wav')

plt.subplot(211)
a, b = sf.read(input_file1);

pxx, fs = plt.psd(a, 512, b)
plt.semilogx(fs, 10*np.log10(pxx))
plt.title('Sound File Read')
plt.grid(which='major', axis='both', color='g', linestyle='-', alpha=0.4)
plt.grid(which='minor', axis='x', color='g', linestyle='-', alpha=0.1)

  
plt.subplot(212)
sample_rate, signal1 = wavfile.read(input_file1)
Pxx, freq = plt.psd(signal1, 512, sample_rate)
plt.semilogx(freq, 10*np.log10(Pxx))
plt.grid(which='major', axis='both', color='g', linestyle='-', alpha=0.4)
plt.grid(which='minor', axis='x', color='g', linestyle='-', alpha=0.1)
plt.title('Wavfile File Read')
plt.ylabel('PSD')

plt.xlabel('Frequency (Hz)')

# set the spacing between subplots
plt.tight_layout()

plt.show()

这是一个示例 .wav 文件的链接。

谢谢!

4

1 回答 1

1

根据您报告的两个值,它确实似乎soundfile.read给了您一个float64介于 -1 和 1 之间的数组,而wavfile.io.read给了您一个int32介于 -2147483648 和 2147483647 之间的数组(-4850432/2147483648 = -0.00225866)。您可以使用以下任一或数组制作标准化float_数组:int_float_

def normalize(signal1):
    try:
        intinfo = np.iinfo(signal1.dtype)
        return signal1 / max( intinfo.max, -intinfo.min )

    except ValueError: # array is not integer dtype
        return signal1 / max( signal1.max(), -signal1.min() )
于 2021-08-19T19:21:27.670 回答