學習一樣東西,個人建議須從三個維度進行:What Why How
這里的內容主要參考胡廣書編寫的《《數字信號處理導論》》7.5.1節,加了一些自己的理解。
提到平均濾波器,做過單片機應用開發的朋友,馬上能想到將一些采樣數據進行加和求平均。誠然如此,從其時域數學描述而言也很直觀:
其中 代表當前測量值,對于單片機應用而言,可以是當前ADC的采樣值或者當前傳感器經過一系列處理的物理量(比如在工業控制領域中的溫度、壓力、流量等測量值),而 表示上一次的測量值,以此類推, 則是前第N-1次測量值。
為了揭示其更深層次的機理,這里用Z傳遞函數將上述公式進一步描述:
對于傅立葉變換而言:
Z變換的本質是拉普拉斯變換的離散化形式, ,令 ,則
令 ,則
?。?/p>
所以,平均濾波器的頻率響應為:
幅頻相頻響應分析
利用下面的python代碼,來分析一下
# encoding: UTF-8
fromscipy.optimize importnewton
fromscipy.signal importfreqz, dimpulse, dstep
frommath importsin, cos, sqrt, pi
importnumpy asnp
importmatplotlib.pyplot asplt
importsys
reload(sys)
sys.setdefaultencoding( ‘utf8’)
#函數用于計算移動平均濾波器的截止頻率
defget_filter_cutoff(N, **kwargs):
func = lambdaw: sin(N*w/ 2) - N/sqrt( 2) * sin(w/ 2)
deriv = lambdaw: cos(N*w/ 2) * N/ 2- N/sqrt( 2) * cos(w/ 2) / 2
omega_0 = pi/N # Starting condition: halfway the first period of sin
returnnewton(func, omega_0, deriv, **kwargs)
#設置采樣率
sample_rate = 200#Hz
N = 7
# 計算截止頻率
w_c = get_filter_cutoff(N)
cutoff_freq = w_c * sample_rate / ( 2* pi)
# 濾波器參數
b = np.ones(N)
a = np.array([N] + [ 0]*(N -1))
#頻率響應
w, h = freqz(b, a, worN= 4096)
#轉為頻率
w *= sample_rate / ( 2* pi)
#繪制波特圖
plt.subplot( 2, 1, 1)
plt.suptitle( “Bode”)
#轉換為分貝
plt.plot(w, 20* np.log10(abs(h)))
plt.ylabel( ‘Magnitude [dB]’)
plt.xlim( 0, sample_rate / 2)
plt.ylim( -60, 10)
plt.axvline(cutoff_freq, color= ‘red’)
plt.axhline( -3.01, linewidth= 0.8, color= ‘black’, linestyle= ‘:’)
# 相頻響應
plt.subplot( 2, 1, 2)
plt.plot(w, 180* np.angle(h) / pi)
plt.xlabel( ‘Frequency [Hz]’)
plt.ylabel( ‘Phase [°]’)
plt.xlim( 0, sample_rate / 2)
plt.ylim( -180, 90)
plt.yticks([ -180, -135, -90, -45, 0, 45, 90])
plt.axvline(cutoff_freq, color= ‘red’)
plt.show
取采樣率為200Hz,濾波器長度為7可得下面的幅頻、相頻響應曲線。從其主瓣可見其幅頻響應為一低通濾波器。幅頻響應略有不平,隨頻率上升而衰減。其相頻響應線性。如果對濾波器有經驗的朋友會知道FIR濾波器的相頻響應是線性的,而移動平均濾波器剛好是FIR的一種特例。
當改變濾波器長度為3/7/21時,僅觀察其幅頻響應:
可見,隨著濾波器的長度變長,其截止頻率變小,其通帶變窄。濾波器的響應變慢,延遲變大。所以實際使用的時候,須根據有用頻率帶寬合理選擇濾波器的長度。有用信號的帶寬可以通過按采樣率采集一定的點進行傅立葉分析可得。如果有帶FFT功能的示波器,也可以直接測量得到。
C語言實現
濾波器的C語言實現,比較容易。干貨在此,快快領走
# defineMVF_LENGTH 5
typedeffloatE_SAMPLE;
/*定義移動平均寄存器歷史狀態*/
typedefstruct_ t_MAF
{
E_SAMPLE buffer[MVF_LENGTH];
E_SAMPLE sum;
intindex;
}t_MAF;
voidmoving_average_filter_init(t_MAF * pMaf)
{
pMaf-》index = -1;
pMaf-》sum = 0;
}
E_SAMPLE moving_average_filter(t_MAF * pMaf,E_SAMPLE xn)
{
E_SAMPLE yn= 0;
inti= 0;
if(pMaf-》index == -1)
{
for(i = 0; i 《 MVF_LENGTH; i++)
{
pMaf-》buffer = xn;
}
pMaf-》sum = xn*MVF_LENGTH;
pMaf-》index = 0;
}
else
{
pMaf-》sum -= pMaf-》buffer[pMaf-》index];
pMaf-》buffer[pMaf-》index] = xn;
pMaf-》sum += xn;
pMaf-》index++;
if(pMaf-》index》=MVF_LENGTH)
pMaf-》index = 0;
}
yn = pMaf-》sum/MVF_LENGTH;
returnyn;
}
測試代碼:
# defineSAMPLE_RATE 500.0f
# defineSAMPLE_SIZE 256
# definePI 3.415926f
intmain
{
E_SAMPLE rawSin[SAMPLE_SIZE];
E_SAMPLE outSin[SAMPLE_SIZE];
E_SAMPLE rawSquare[SAMPLE_SIZE];
E_SAMPLE outSquare[SAMPLE_SIZE];
t_MAF mvf;
FILE *pFile=fopen( “。/simulationSin.csv”, “wt+”);
/*方波測試*/
if(pFile== NULL)
{
printf( “simulationSin.csv opened failed”);
return-1;
}
for( inti= 0;i《SAMPLE_SIZE;i++)
{
rawSin = 100* sin( 2*PI* 20*i/SAMPLE_RATE)+rand% 30;
}
/*正弦信號測試*/
for( inti= 0;i《SAMPLE_SIZE/ 4;i++)
{
rawSquare = 5+rand% 10;
}
for( inti=SAMPLE_SIZE/ 4;i《 3*SAMPLE_SIZE/ 4;i++)
{
rawSquare = 100+rand% 10;
}
for( inti= 3*SAMPLE_SIZE/ 4;i《SAMPLE_SIZE;i++)
{
rawSquare = 5+rand% 10;
}
/*初始化*/
moving_average_filter_init(&mvf);
/*濾波*/
for( inti= 0;i《SAMPLE_SIZE;i++)
{
outSin=moving_average_filter(&mvf,rawSin);
}
for( inti= 0;i《SAMPLE_SIZE;i++)
{
fprintf(pFile, “%f,”,rawSin);
}
fprintf(pFile, “n”);
for( inti= 0;i《SAMPLE_SIZE;i++)
{
fprintf(pFile, “%f,”,outSin);
}
fclose(pFile);
pFile=fopen( “。/simulationSquare.csv”, “wt+”);
if(pFile== NULL)
{
printf( “simulationSquare.csv opened failed”);
return-1;
}
/*初始化*/
moving_average_filter_init(&mvf);
/*濾波*/
for( inti= 0;i《SAMPLE_SIZE;i++)
{
outSquare=moving_average_filter(&mvf,rawSquare);
}
for( inti= 0;i《SAMPLE_SIZE;i++)
{
fprintf(pFile, “%f,”,rawSquare);
}
fprintf(pFile, “n”);
for( inti= 0;i《SAMPLE_SIZE;i++)
{
fprintf(pFile, “%f,”,outSquare);
}
fclose(pFile);
return0;
}
對于方波測試,利用excel生成波形,可得如下的波形。從波形明顯可見,長度為7的移動平均濾波器對于隨機噪聲的濾波效果比較滿意。從圖中還可以看出,移動平均濾波器在信號鏈中會引入一定的延時,在應用時需要考慮。對于一般的傳感測量如果沒有明確的要求,常常可以忽略。
對于正弦信號而言,移動平均濾波器也有比較明顯的效果,只是其通帶比較窄,如果有用信號頻率比較高,則移動平均濾波器將不適合。
評論
查看更多