[SciPy-User] butterworth filter on .WAV file

Joshua Holbrook josh.holbrook at gmail.com
Wed Jul 7 14:45:25 EDT 2010


On Wed, Jul 7, 2010 at 10:40 AM, Peter Howard <peterhoward42 at gmail.com> wrote:
> 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.
>
> Pete
>
>
> <snip>
>
> 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)
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at scipy.org
> http://mail.scipy.org/mailman/listinfo/scipy-user
>
>

What does the output file sound like?

--Josh



More information about the SciPy-User mailing list