解释.WAV文件[Python]

2024-10-01 02:32:35 发布

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

我试图用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)))  

我用过解包结构('B'..)对于此特定文件。正在加载的音频文件输出以下规范:

^{pr2}$

我知道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()     

Tags: 文件inselffordatastreamframesdef
1条回答
网友
1楼 · 发布于 2024-10-01 02:32:35

我认为这些数字是薄膜振动的延伸或体积的抽象。值越大,膜的振动越大。您可以阅读更多here。在

样本宽度是体积的范围。不同类型的抽样,样本宽度不同。例如,如果采样宽度是1位,那么我们只能描述音频是否有声音。所以,通常采样宽度越大,音频质量就越高。关于样本宽度的更多信息,您可以阅读Sample Rate and Bitrate: The Guts of Digital Audio。在

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

我建议使用numpy来执行音频执行。例如,要获得所需的数组,只需使用np.fromstring。并定义了FFT等相关函数。许多样品和论文可以在谷歌上找到。在

相关问题 更多 >