[SciPy-User] butterworth filter on .WAV file

Peter Howard peterhoward42@gmail....
Wed Jul 7 13:40:31 CDT 2010

I'm trying to write a very simple example of applying a band pass filter to
a .WAV music file.
I'm distinctly rusty on DSP and inexperienced with SciPy/NumPy so apologies
if I've made a dumb mistake.

It executes without errors or warnings.
It produces the output file, but this is twice the size of the input file,
which is clearly wrong.
I'm most uncertain about casting the filtered data back to integers and thus
being suitable for writing back out to .WAV.
I'm also bit uncertain about my interpretation / understanding of the
frequency and gain specifications.

Any help and advice very much appreciated.



from scipy.io.wavfile import read, write
from scipy.signal.filter_design import butter, buttord
from scipy.signal import lfilter
from numpy import asarray

def convert_hertz(freq):
    # convert frequency in hz to units of pi rad/sample
    # (our .WAV is sampled at 44.1KHz)
    return freq * 2.0 / 44100.0

rate, sound_samples = read('monty.wav')
pass_freq = convert_hertz(440.0) # pass up to 'middle C'
stop_freq = convert_hertz(440.0 * 4) # max attenuation from 3 octaves higher
pass_gain = 3.0 # tolerable loss in passband (dB)
stop_gain = 60.0 # required attenuation in stopband (dB)
ord, wn = buttord(pass_freq, stop_freq, pass_gain, stop_gain)
b, a = butter(ord, wn, btype = 'low')
filtered = lfilter(b, a, sound_samples)
integerised_filtered = asarray(filtered, int)
write('monty-filtered.wav', rate, integerised_filtered)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.scipy.org/pipermail/scipy-user/attachments/20100707/288b035e/attachment.html 

More information about the SciPy-User mailing list