# -*- coding: utf-8 -*-
"""
Created on Fri May 27 14:07:46 2016
@author: Judd
"""
#simulate downsampling from 88.2kHz to 44.1khz
import numpy as np
from scipy import signal
import matplotlib.pyplot as plt
fs_input=88200
fs_output=44100
# define parameters for a kaiser-windowed, linear-phase lowpasss filter:
numtaps=511
kaiserbeta=20.0
min_nyquist=min(fs_input,fs_output)/2
cutoff = (min_nyquist * 21 / 22) / fs_input
# display normalized cutoff frequency and cutoff frequency in Hz
print(cutoff)
print(cutoff*fs_input)
# create the lowpass filter:
lpass = signal.firwin(numtaps,cutoff,window=('kaiser',kaiserbeta),pass_zero=True,scale=True,nyq=0.5)
# get frequency response of the lowpass filter:
freq, response = signal.freqz(lpass)
ampl = np.abs(response)
# plot the frequency response of the linear-phase Lowpass filter (in Blue):
fig1 = plt.figure()
#plt.xlabel('frequency')
plt.ylabel('dB')
#plt.xscale('log')
plt.axis([20500,24050,-250,6])
plt.grid(True)
ax1 = fig1.add_subplot(111)
ax1.plot(fs_input*freq/(2*np.pi), 20*np.log10(ampl), 'b-') # freq in Hz
# convert Linear Phase Filter to Minimum Phase:
fftsize = 32768 # needs to be fairly generous for good results !
maxphaseFilter=np.real(np.fft.ifft(np.exp(signal.hilbert(np.real(np.log(np.fft.fft(lpass,fftsize)))))))
minphaseFilter=maxphaseFilter[::-1] # reverse
finalFilt=minphaseFilter[0:numtaps-1]
# get frequency response of minimum-phase filter:
freq2, response2 = signal.freqz(minphaseFilter)
ampl2 = np.abs(response2)
# plot frequency response of Minimum-phase Filter (in Green)
ax1.plot(fs_input*freq2/(2*np.pi), 20*np.log10(ampl2), 'g-') # freq in Hz
# plot the actual impulse response (minphase in Green, linphase in Blue):
fig2 = plt.figure()
plt.axis([0,511,-1,1])
ax2=fig2.add_subplot(111)
ax2.plot(lpass,'b-')
ax2.plot(minphaseFilter,'g-')
plt.show()
This crude script demonstrates how to transform a Linear-Phase FIR filter into a Minimum-Phase FIR filter using the analytic ('hilbert') function.
Although this technique is discussed in DSP literature, I found very little in the way of practical coding examples, and it took me a bit of time to figure it out, so this may be of use to someone !
Also, check out this old Matlab post:
http://au.mathworks.com/matlabcentral/newsreader/view_thread/17748
Although this technique is discussed in DSP literature, I found very little in the way of practical coding examples, and it took me a bit of time to figure it out, so this may be of use to someone !
Also, check out this old Matlab post:
http://au.mathworks.com/matlabcentral/newsreader/view_thread/17748
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.