(1)測評現場提供由RLC元件(各1個)組成的“未知模型電路”。 按照圖3所示,探究裝置連接該電路的輸入和輸出端口,對該電路進行 自主學習、建模(不可借助外部測試設備),2分鐘內完成學習建模,顯 示“未知模型電路”的濾波類型。 圖3 學習、建模
(2)學習建模完成后,斷開探究裝置和“未知模型電路”的端口連接,將信號發生器接入探究裝置和“未知模型電路”的輸入端口(探究裝置輸入 電阻不小于100kΩ),如圖4所示。探究裝置能根據信號發 生器的輸出信號推理生成與“未知模型電路”相同的輸出信 號。要求探究裝置和“未知模型電路”的輸出信號相比波形 無失真、在示波器上能連續同頻穩定顯示(相位無要求), 兩者峰峰值相對誤差絕對值不大于10%。
????????信號發生器的輸出為頻率1kHz~50kHz(步長200Hz)、 圖4 裝置與未知模型電路輸出比對 峰峰值2V的周期信號,類型分別為:正弦波、矩形波(占空比10%~50%、步長5%)和其他 周期信號。?
????????該部分核心功能為對電路進行自主學習、建模。并且要學習的電路對于不同頻率的輸入有著不同的響應。因此,可以使用參數自適應的FIR濾波器來實現該功能。
計算 FIR(有限脈沖響應)濾波器參數是設計 FIR 濾波器的核心步驟,其目標是確定濾波器的單位脈沖響應系數(即抽頭系數),以滿足預設的頻率響應指標(如通帶截止頻率、阻帶截止頻率、通帶波紋、阻帶衰減等)。以下是詳細的計算方法和步驟:
一、FIR 濾波器設計的基本原理
FIR 濾波器的頻率響應由其單位脈沖響應?h(n)?決定,表達式為:H(ejω)=∑n=0N?1?h(n)e?jωn
其中,N?是濾波器的階數(抽頭數),ω?是數字角頻率(范圍?0~π)。
設計的核心是找到合適的?h(n),使?H(ejω)?逼近理想頻率響應。
二、FIR 濾波器參數計算的關鍵步驟
1. 明確設計指標
首先需確定濾波器的基本參數,包括:
- 濾波器類型:低通、高通、帶通、帶阻。
- 截止頻率:通帶截止頻率?ωp?(或?fp?)、阻帶截止頻率?ωs?(或?fs?)(需轉換為數字頻率,公式:ω=2πf/fs?,fs??為采樣頻率)。
- 通帶最大波紋:δp?(允許的通帶衰減波動,如?0.1?dB)。
- 阻帶最小衰減:As?(阻帶衰減要求,如?60?dB)。
2. 選擇設計方法
FIR 濾波器參數計算的主流方法有以下三種,各有適用場景:
(1)窗函數法(最常用)
原理:用理想濾波器的脈沖響應(非因果、無限長)與窗函數(有限長)卷積,得到有限長、因果的?h(n)。
步驟:
- 確定理想頻率響應?Hd?(ejω)(如低通濾波器的理想響應為:∣ω∣≤ωc??時為 1,否則為 0)。
- 計算理想脈沖響應?hd?(n):通過逆傅里葉變換?hd?(n)=2π1?∫?ππ?Hd?(ejω)ejωndω。
- 例:理想低通的?hd?(n)=πnsin(ωc?n)?(ωc??為截止角頻率)。
- 選擇窗函數(如矩形窗、漢寧窗、漢明窗、布萊克曼窗等),窗函數需滿足:
- 長度?N(需根據過渡帶寬和阻帶衰減確定,見下文)。
- 因果性:將?hd?(n)?右移?(N?1)/2?個采樣點,得到?h(n)=hd?(n?(N?1)/2)?w(n),其中?w(n)?為窗函數。
窗函數選擇參考:
窗函數 | 過渡帶寬(2π/N) | 阻帶最小衰減(dB) | 適用場景 |
---|---|---|---|
矩形窗 | 1.8 | 21 | 過渡帶寬要求嚴,衰減要求低 |
漢寧窗 | 6.2 | 44 | 平衡過渡帶和衰減 |
漢明窗 | 6.6 | 53 | 常用,衰減適中 |
布萊克曼窗 | 11.0 | 74 | 高阻帶衰減要求 |
階數?N?計算:
根據過渡帶寬?Δω=ωs??ωp?,窗函數法的?N≈Δω窗函數過渡帶寬系數?2π?。
- 例:漢明窗的過渡帶寬系數為 6.6,若?Δω=0.2π,則?N≈6.6×2π/0.2π=66。
(2)頻率采樣法
原理:在頻域對理想頻率響應?Hd?(ejω)?進行等間隔采樣,通過 IDFT 得到?h(n)。
步驟:
- 確定采樣點數?N(濾波器階數),在?ωk?=2πk/N(k=0,1,...,N?1)處對?Hd?(ejω)?采樣,得到?H(k)。
- 為改善過渡帶性能,可在通帶與阻帶之間設置過渡采樣點(非 0 非 1 的中間值)。
- 計算?h(n)=N1?∑k=0N?1?H(k)ej2πkn/N。
特點:直接控制頻域采樣點,但過渡帶性能較差,需額外優化過渡點。
(3)等波紋優化設計法(切比雪夫逼近法)
原理:通過極小化最大誤差(通帶和阻帶內的波紋均勻分布),使實際頻率響應與理想響應的偏差最小。
步驟:
- 定義逼近區間(通帶?[0,ωp?]、阻帶?[ωs?,π])和誤差權重(阻帶誤差權重通常更大)。
- 利用 Remez 交換算法求解最優?h(n),該算法通過迭代找到極值點,使誤差在各區間內達到最大值且符號交替。
特點:相同階數下性能優于窗函數法,過渡帶更窄,阻帶衰減更高,但計算更復雜(通常需工具實現)。
其中頻率采樣法易于實現
發揮部分可以分為兩個方向來處理,
對于頻率步進要求較高,意味著計算精度高,計算復雜度高(濾波器階數高于512階),對此,直接使用傅里葉變換進行濾波處理較為合適。
1.測試出電路的幅頻特性曲線(頻率步進應與FFT的頻率精度保持一致);
2.對輸入信號進行傅里葉變換
3.使用幅頻特性曲線對信號頻譜進行加權處理
4.對處理過后的頻譜進行信號重建,使用傅里葉反變換實現
C語言版本 FFT函數
int NUM = 1 << num;float XI[64] = {0};int i,j,k; float PLL = Fs / 64;for(i=0;i<NUM;i++) {arr2[i] = arr[(int)(PLL * i)];}for(i=0;i<NUM;i++){XR[i] = (float)arr2[K_VALUE[i]];}int TR, TI, WR, WI;for(int i=0;i<num;i++) {int B = 1<<i; for(int j=0;j<B;j++) {int p=j*(1<<(num-i-1)); //旋轉因子的系數for(int k=j;k<NUM;k=k+2*B){TR= XR[k];TI=XI[k];WR= XR[k+B]*COS_VALUE[p]+XI[k+B]*SIN_VALUE[p];WI=-XR[k+B]*SIN_VALUE[p]+XI[k+B]*COS_VALUE[p];XR[k]=(TR+WR);XI[k]=TI+WI;XR[k+B]=(TR-WR);XI[k+B]=TI-WI;}}}
對于實時性要求較高(濾波器階數低于512階),意味著較少的計算量,和較低的頻率步進,對此,使用fir濾波器較為合適
通過將幅頻特性曲線轉換到時域,得到FIR濾波器系數。
C語言版本的FIR濾波器系數計算
/*------------數字指標-------------------*/ double Wc1=2*pi*((Transfer_param->fp1+Transfer_param->fst1)/2)/Transfer_param->fs;double Wc2=2*pi*((Transfer_param->fp2+Transfer_param->fst2)/2)/Transfer_param->fs;double det_W1=2*pi*abs(Transfer_param->fst1-Transfer_param->fp1)/Transfer_param->fs; double det_W2=2*pi*abs(Transfer_param->fst2-Transfer_param->fp2)/Transfer_param->fs; double det_W=det_W1;if((Filter_type==BANDPASSFILTER)||(Filter_type==BANDSTOPFILTER)) {det_W=det_W1>det_W2?det_W2:det_W1;}int n;int N;int window; /*窗函數選擇--------------------------------------------------------------------------- */ // 根據衰as減選擇窗 switch((int)(Transfer_param->ast/10)){case 2: //20db N=(int)1.8*pi/det_W;if(N!=1.8*pi/det_W)N++;window=Rectangle;break; case 3://30db N=(int)6.1*pi/det_W;if(N!=6.1*pi/det_W)N++;window=triangle;break;case 4: //40db N=(int)(6.2*pi/det_W);if(N!=6.2*pi/det_W)N++;window=Hanning;break;case 5 ://50db N=(int)(6.6*pi/det_W);if(N!=6.6*pi/det_W)N++;window=Hamming;break;case 7 ://70dbN=(int)11*pi/det_W;if(N!=11*pi/det_W)N++;window=Blackman;break;default: return 0; }int const const_N=N;switch(window){case Rectangle: for(n=0;n<N;n++){win_param[n]=1; }break;case triangle:for(n=0;n<N;n++){win_param[n]=1; }break;case Hanning: for(n=0;n<N;n++){win_param[n]=0.5*(1-cos(2*pi*n/(N-1))); }break;case Hamming :for(n=0;n<N;n++){win_param[n]=0.54-0.46*cos(2*pi*n/(N-1));} break;case Blackman :for(n=0;n<N;n++){win_param[n]=0.42-0.5*cos((4*pi*n/(N-1))-0.08*(4*pi*n/(N-1))); } break;default:return 0; }/*計算FIR的傳遞函數*/ Filter_h.N=N;for(n=0;n<N;n++) {Filter_h.Hn[n] = h_lixiang[n]*win_param[n];}return &Filter_h;
另外對于32單片機,實時處理信號較為困難,一般使用乒乓操作對數據進行處理