2013-07-16 6 views
3

Я пытаюсь обработать аудиофайл в 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()  
+0

Эти значения представляют собой значения амплитуды давления во временной области. Вы должны использовать FFT для преобразования сигнала в частотную область, выполнить фильтр и FFT снова во временную область. – OregonTrail

ответ

1

Я думаю, что эти цифры аннотации распространяется вибрация мембраны или объема. Более высокое значение означает большую вибрацию мембраны. Вы можете прочитать далее here.

И ширина выборки - это диапазон объема. При разных типах выборки ширина выборки различна. Например, если ширина выборки равна 1 бит, мы можем описать звук как звук или нет. Таким образом, обычно более высокая ширина выборки, звук имеет более высокое качество. Для получения дополнительной информации о ширине образца вы можете прочитать Sample Rate and Bitrate: The Guts of Digital Audio.

И синглы, хранящиеся в аудиофайле, находятся во временной области. Он не представляет частоты. Если вы хотите получить значения в частотной области, вы можете выполнить FFT на полученном массиве.

Рекомендую использовать numpy, чтобы сделать аудиозапись. Например, чтобы получить массив, который вам нужен, вам просто нужно использовать np.fromstring. И связанные функции, такие как FFT, уже определены. Многие образцы и документы можно найти в Google.

+0

При использовании np.tostring, как вы определяете параметр dtype, передаваемый вместе со строкой? Я пробовал пару, а возвращаемые значения все отличались, я предполагаю, что для этого случая будет использоваться «int8» ?. Спасибо за ваше время, ваш пост был очень информативным. EDIT: На самом деле это, вероятно, просто должно соответствовать ширине выборки, которую я предполагаю. – diverges

+0

Я думаю, вы можете определить dtype по sampwidth. Если это 1, вы можете использовать int8, 2 для int16. Мне нужно что-то сделать для обработки звука месяц назад, так что Google для какой-то информации. Теперь я читаю «Understanding Digital Signal Processing 3rd Edition». Это полезно. @ Diverges – zhangyangyu

+0

Первая программа Я пытаюсь сделать что-то со звуком и узнал python пару дней назад, поэтому я все еще не знаком с библиотеками. Еще раз спасибо, чтобы применить фильтр к аудиофайлу.Конечная цель - удалить все фоновые звуки из записи микрофона, поэтому мне нужно будет продолжить чтение. – diverges

Смежные вопросы