Я пытаюсь обработать аудиофайл в python и применить фильтр Low Pass для удаления некоторых фоновых шумов. В настоящее время я способен успешно загружать файл и генерировать массив с его значениями данных:Интерпретация файла .WAV [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()
Эти значения представляют собой значения амплитуды давления во временной области. Вы должны использовать FFT для преобразования сигнала в частотную область, выполнить фильтр и FFT снова во временную область. – OregonTrail