[SciPy-User] band pass filter .WAV file
Mon Jul 12 09:35:57 CDT 2010
I don't know if something is wrong or not, but a quick guess at why the file
is twice the size of the original might be that the input file was mono
while the output file was stereo, maybe?
On Wed, Jul 7, 2010 at 4:56 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 a 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
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the SciPy-User