Prelab 2 - Notch Filter Design
You will investigate the basics of audio processing and filter design in Python.
Refer to the Submission Instruction page for more information.
Part 1 - Jupyter Notebook
We will be using Jupyter Notebook for all of our prelabs (or labs if you prefer). Jupyter Notebook is embedded in the anaconda python distribution, it is popular because it is based on interactive python that supports inline plotting and Markdown/Latex documentation. You can display intermediate results easily for quickly prototyping your ideas and you can also store them without the need to re-run everything.
Create New Notebook
From the command line (or your windows start menu), type:
to open the jupyter notebook in your browser:
Inside the just-opened webpage, Choose New -> Python[default]. A jupyter notebook will be opened in a new tab.
File->Rename and rename it to Prelab 2.
In the first cell in the opened notebook, type
ls and press
Shift + Enter(shortcut to run the selected cell). It should list all the file in your current directory.
Make sure that you are in the same folder where the wav files are stored. Run the following commands to find out your current working directory.
import os print(os.getcwd())
Load audio files
To import the wave file and read both sampling rate and raw data, you might use:
from scipy.io.wavfile import read sampling_rate, data = read('with_hum.wav')
And to play the audio file:
from IPython.display import Audio Audio('with_hum.wav')
A small control panel should appear below the cell, click on the button to play the audio. Play both wav files to see the difference.
As in Lab 1, we use
matplotlib.pyplot module to display the figure in Jupyter Notebook.
You may need to include this line at the beginning of the notebook to make the plot visible in the notebook:
Part 2 - Frequency Response
One of the basic approach to analyse some signal is to convert it to frequency domain and analyse its frequency response. Apply fourier transform to convert a signal to frequency domain.
Plot the magnitude of the frequency response of the signal with the 400 Hz humming (with_hum.wav).
Use numpy.fft.fft() function, examples are available at the bottom of the linked page.
Part 3 - Notch Filter Design
We want to filter out the 400 Hz humming interference out from the
with_hum.wav so we want to design a bandstop filter that will surpress signals around that frequency.
Design a bandstop filter to filter out the humming interference. Plot the magnitude and phase of the frequency response of the filter.
All of our filters and any further processing will be in the digital domain, not analog domain.
Brifely discribe your filter design. Why does your filter have the number of taps that it has? Could you achieve the same effect with less taps? What are the practical effects of using less taps?
Part 4 - Apply Filtering
Filter the 400 Hz humming interference out from the
with_hum.wav using your bandstop filter from Exercise 2. Play the output audio and you should hear the humming interference died out.
Plot the frequency response of the filtered signal. Play the filtered signal again.
Use scipy.signal.lfilter() function to apply filtering.
Prelab 2 will be graded as follows:
Assignment 1 [0.5 point]
A plot of the magnitude of the frequency response of the original signal (with the 400 Hz humming) [0.5 point]
Assignment 2 [1 point]
A plot of the magnitude and phase of your bandstop filter's frequency response [0.5 point]
Short answer question [0.5 point]
Assignmet 3 [0.5 point]
A plot of the magnitude of the frequency response of the filtered signal (with the 400 Hz humming canceled out) [0.5 point]