[SciPy-User] butterworth filter on .WAV file
Wed Jul 7 13:45:25 CDT 2010
On Wed, Jul 7, 2010 at 10:40 AM, Peter Howard <firstname.lastname@example.org> 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.
> 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
What does the output file sound like?
More information about the SciPy-User