我正在尝试在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()
答案 0 :(得分:3)
我认为这些数字是膜振动或体积延伸的抽象概念。值越高意味着膜的振动越大。您可以阅读更多here。
样本宽度是音量范围。对于不同类型的采样,样本宽度是不同的。例如,如果样本宽度为1位,那么我们只能将音频描述为有声音。因此,通常更高的样本宽度,音频质量更高。有关样本宽度的更多信息,请阅读Sample Rate and Bitrate: The Guts of Digital Audio。
存储在音频文件中的信号属于时域。它不代表频率。如果您想获得频域中的值,可以对所获得的数组执行FFT。
我建议使用numpy进行音频演奏。例如,要获得所需的数组,只需使用np.fromstring
即可。并且已经定义了诸如FFT的相关功能。许多样本和论文都可以在Google上找到。