[SciPy-User] butterworth filter on .WAV file
Wed Jul 7 17:12:26 CDT 2010
I've had good luck with:
fs,data = read(infilename)
data = np.float64(data/32768.)
# ... process ...
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.
> 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
More information about the SciPy-User