Interpreting a .WAV file [Python]
audio, python, python-3.x
Solution
I think the numbers are abstract of the extends of the vibration of the membrane or the volume. Higher value means a large vibration of the membrane. You can read more here.
And the sample width is the range of volume. With different types of sampling, the sample width is different. For example, if the sample width is 1 bit, so we can only describe the audio as having sound or not. So, usually higher sample width, the audio is of higher quality. For more about sample width, you can read Sample Rate and Bitrate: The Guts of Digital Audio.
And the singnals stored in the audio file is in the time domain. It doesn't represent frequency. If you want to get the values in frequency domain, you can perform an FFT on the array you get.
I recommend using numpy to do audio perform. For example, to get the array you want, you just need to use `np.fromstring`. And the related functions such as FFT have already been defined. Many samples and papers can be found on Google.
Problem
I'm attempting to process an audio file in python and apply a Low Pass filter to remove some background noise. Currently I am capable of successfully loading the file and generating 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 audio file being loaded outputs the following specifications: ``` nchannels: 1 sampwidth: 1 framerate: 6000 ``` I know that sampwidth specifies the width in bytes returned by each readframes(1) call. Upon loading the array it contains values as shown (ranging from 128 to 180 throughout): ``` >>> 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 do those numbers represent? Other audio files with larger sample-width give completely different numbers. My goal is to trim out certain frequencies from the audio file, unfortunately I know very little about this and am unaware as to how these values relate to frequency. What is the best ways to remove all values above a certain frequency threshold? Additionally the values are being packed back to a different 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() ```