[SciPy-User] butterworth filter on .WAV file

Christopher Brown c-b at asu.edu
Wed Jul 7 18:12:26 EDT 2010


I've had good luck with: 

# Read
fs,data = read(infilename)
data = np.float64(data/32768.)

# ... process ...

# Write
write(outfilename, fs, np.int16(data*32768))

On Wednesday 07 July 2010 11:40:31 Peter Howard 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)

-- 
Christopher Brown, Ph.D.
Associate Research Professor
Department of Speech and Hearing Science
Arizona State University
http://pal.asu.edu




More information about the SciPy-User mailing list