解释.WAV文件[Python]

时间:2013-07-16 12:45:02

标签: python audio python-3.x

我正在尝试在python中处理音频文件并应用低通滤镜来消除一些背景噪音。目前,我能够成功加载文件并生成一个包含其数据值的数组:

class AudioModule:

    def __init__(self, fname=""):
      self.stream = wave.open(fname, 'r')
      self.frames = [] 

    def build(self):
      self.stream.rewind()
      for x in range(self.stream.getnframes()):
           self.frames.append(struct.unpack('B',self.stream.readframes(1)))  

我将struct.unpack('B'..)用于此特定文件。正在加载的音频文件输出以下规格:

nchannels: 1
sampwidth: 1
framerate: 6000

我知道sampwidth指定每个readframes(1)调用返回的宽度(以字节为单位)。加载数组后,它包含如图所示的值(范围从128到180):

>>> r.frames[6000:6025]
[(127,), (127,), (127,), (127,), (128,), (128,), (128,), (128,), (128,), (128,),      (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,), (128,)]

问题: 这些数字代表什么?其他具有较大样本宽度的音频文件会给出完全不同的数字。我的目标是从音频文件中删除某些频率,遗憾的是我对此知之甚少,并且不知道这些值与频率的关系。

删除某个频率阈值以上的所有值的最佳方法是什么?

此外,这些值将被打包回另一个文件,如下所示:

def store(self, fout=""):
      out = wave.open(fout, 'w')
      nchannels = self.stream.getnchannels()
      sampwidth = self.stream.getsampwidth()
      framerate = self.stream.getframerate()
      nframes = len(self.frames)
      comptype = "NONE"
      compname = "not compressed"

      out.setparams((nchannels, sampwidth, framerate, nframes,
          comptype, compname))

      if nchannels == 1:
           for f in self.frames:
                data = struct.pack('B', f[0])
                out.writeframes(data)
      elif nchannels == 2:
           for f in self.frames:
                data = struct.pack('BB', f[0], f[1])
                out.writeframes(data)
      out.close()     

1 个答案:

答案 0 :(得分:3)

我认为这些数字是膜振动或体积延伸的抽象概念。值越高意味着膜的振动越大。您可以阅读更多here

样本宽度是音量范围。对于不同类型的采样,样本宽度是不同的。例如,如果样本宽度为1位,那么我们只能将音频描述为有声音。因此,通常更高的样本宽度,音频质量更高。有关样本宽度的更多信息,请阅读Sample Rate and Bitrate: The Guts of Digital Audio

存储在音频文件中的信号属于时域。它不代表频率。如果您想获得频域中的值,可以对所获得的数组执行FFT

我建议使用numpy进行音频演奏。例如,要获得所需的数组,只需使用np.fromstring即可。并且已经定义了诸如FFT的相关功能。许多样本和论文都可以在Google上找到。