I am trying to process an audio file in python and apply a Low Pass filter to remove some background noise. Currently, I can successfully upload the file and create an array with its data values:
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)))
I used struct.unpack ('B' ..) for this particular file. The downloadable audio file displays the following specifications:
nchannels: 1 sampwidth: 1 framerate: 6000
I know that sampwidth indicates the width in bytes returned by each readframes (1) call. When loading an array, it contains values โโas shown (from 128 to 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,)]
Question: What are these numbers? Other audio files with a larger sample width give completely different numbers. My goal is to trim certain frequencies from the audio file, unfortunately, I know very little about this and donโt know how these values โโrelate to the frequency.
What are the best ways to remove all values โโabove a certain frequency threshold?
In addition, the values โโare packaged back into another file as follows:
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()