【问题标题】:Difference in magnitude between sound file read and wave file read in PythonPython中读取的声音文件和波形文件之间的幅度差异
【发布时间】:2021-08-19 17:42:07
【问题描述】:

我发现使用 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.

谢谢!

【问题讨论】:

  • 据我所知,wavfile.io.read 和 soundfile.read 做的事情几乎相同,除了一个默认行为:wavfile 从文件中确定其数组的 dtype,而 soundfile 有一个默认 @ 987654329@。通常,声音的float_ 数组在-1 和1 之间进行归一化,而int_ 数组将信号保持在整数的最小值和最大值之间。检查您的阵列的 .dtype 以及 .min() 和 .max() 值。
  • @BatWannaBe,感谢您的意见。我确实看到 ndarray(使用第一个数据点),对于 soundfile,值是 -0.00225866,而对于 wavfile,数字是 -4850432。有没有办法将这些wavfile 数字转换为float_?

标签: python wav soundfile


【解决方案1】:

根据您报告的两个值,soundfile.read 确实提供了一个介于 -1 和 1 之间的 float64 数组,而 wavfile.io.read 提供了一个介于 -2147483648 和 2147483647 之间的 int32 数组 (-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() )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    • 1970-01-01
    相关资源
    最近更新 更多