我试图用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()
我认为这些数字是薄膜振动的延伸或体积的抽象。值越大,膜的振动越大。您可以阅读更多here。在
样本宽度是体积的范围。不同类型的抽样,样本宽度不同。例如,如果采样宽度是1位,那么我们只能描述音频是否有声音。所以,通常采样宽度越大,音频质量就越高。关于样本宽度的更多信息,您可以阅读Sample Rate and Bitrate: The Guts of Digital Audio。在
存储在音频文件中的信号在时域中。它不代表频率。如果你想得到频域的值,你可以对你得到的数组执行FFT。在
我建议使用numpy来执行音频执行。例如,要获得所需的数组,只需使用
np.fromstring
。并定义了FFT等相关函数。许多样品和论文可以在谷歌上找到。在相关问题 更多 >
编程相关推荐