Python 中读取的声音文件和读取的波形文件之间的幅度差异
Difference in magnitude between sound file read and wave file read in Python
我发现使用 soundfile
和 wavefile
读取 wav 文件之间的幅度响应存在问题。以下是不同的情节:
你能告诉我我需要在 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()
Here is a link to an example .wav file.
谢谢!
根据您报告的两个值,确实看起来 soundfile.read
给了您一个介于 -1 和 1 之间的 float64
数组,而 wavfile.io.read
给了您一个 int32
-2147483648 和 2147483647 之间的数组 (-4850432/2147483648 = -0.00225866)。您可以使用以下内容从 int_
或 float_
数组创建规范化的 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() )
我发现使用 soundfile
和 wavefile
读取 wav 文件之间的幅度响应存在问题。以下是不同的情节:
你能告诉我我需要在 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()
Here is a link to an example .wav file.
谢谢!
根据您报告的两个值,确实看起来 soundfile.read
给了您一个介于 -1 和 1 之间的 float64
数组,而 wavfile.io.read
给了您一个 int32
-2147483648 和 2147483647 之间的数组 (-4850432/2147483648 = -0.00225866)。您可以使用以下内容从 int_
或 float_
数组创建规范化的 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() )