本文目錄一覽:
- 1、一段matlab低通濾波器程序,求改編成C語言。
- 2、求IIR及FIR數字濾波器的C語言實現。(VC++)
- 3、如何用C語言實現低通濾波器
- 4、【原創】C++實現IIR二階數字濾波器(一)
- 5、求脈衝響應不變法設計Elliptic型IIR數字低通濾波器
一段matlab低通濾波器程序,求改編成C語言。
這個我剛好做過一個濾波器,事實上對時域信號做FFT,截取一定點數再做逆FFT相當於理想濾波。設計濾波器代碼如下:
f1=100;f2=200;%待濾波正弦信號頻率
fs=2000;%採樣頻率
m=(0.3*f1)/(fs/2);%定義過度帶寬
M=round(8/m);%定義窗函數的長度
N=M-1;%定義濾波器的階數
b=fir1(N,f2/fs);%使用fir1函數設計濾波器
%輸入的參數分別是濾波器的階數和截止頻率
figure(1)
[h,f]=freqz(b,1,512);%濾波器的幅頻特性圖
%[H,W]=freqz(B,A,N)當N是一個整數時函數返回N點的頻率向量和幅頻響應向量
plot(f*fs/(2*pi),20*log10(abs(h)))%參數分別是頻率與幅值
xlabel(‘頻率/赫茲’);ylabel(‘增益/分貝’);title(‘濾波器的增益響應’);
figure(2)
subplot(211)
t=0:1/fs:0.5;%定義時間範圍和步長
s=sin(2*pi*f1*t)+sin(2*pi*f2*t);%濾波前信號
plot(t,s);%濾波前的信號圖像
xlabel(‘時間/秒’);ylabel(‘幅度’);title(‘信號濾波前時域圖’);
subplot(212)
Fs=fft(s,512);%將信號變換到頻域
AFs=abs(Fs);%信號頻域圖的幅值
f=(0:255)*fs/512;%頻率採樣
plot(f,AFs(1:256));%濾波前的信號頻域圖
xlabel(‘頻率/赫茲’);ylabel(‘幅度’);title(‘信號濾波前頻域圖’);
figure(3)
sf=filter(b,1,s);%使用filter函數對信號進行濾波
%參數分別為濾波器系統函數的分子和分母多項式係數向量和待濾波信號輸入
subplot(211)
plot(t,sf)%濾波後的信號圖像
xlabel(‘時間/秒’);ylabel(‘幅度’);title(‘信號濾波後時域圖’);
axis([0.2 0.5 -2 2]);%限定圖像坐標範圍
subplot(212)
Fsf=fft(sf,512);%濾波後的信號頻域圖
AFsf=abs(Fsf);%信號頻域圖的幅值
f=(0:255)*fs/512;%頻率採樣
plot(f,AFsf(1:256))%濾波後的信號頻域圖
xlabel(‘頻率/赫茲’);ylabel(‘幅度’);title(‘信號濾波後頻域圖’);
求IIR及FIR數字濾波器的C語言實現。(VC++)
這個問題比較複雜,最近本人也在研究數字濾波,
結合圖片說一下
第一個圖是fir的流程圖,其中Z-1是延遲,是單個採樣時間1/fs
n階的fir濾波器就是選取最近的n+1個樣本,然後使他們各自乘以自己的濾波器係數即圖中的F(n),[一般其他書的表示是h(n)]
然後相加得到輸出的y(n)就是一個輸出點
,其中F(n)的得出需要根據採樣頻率和濾波器的通帶和阻帶來決定
其中為了改善旁瓣的幅值,一般在採樣後給樣本或者h(n)加窗,當然可以用「最佳方法」來做
得出h(n)大致方法是先將矩形窗進行DFT,得出h(n),然後對h(n)進行加窗得出h(k),然後將∑h(k)×x(n)=y(n),假如階數較多可以用傅里葉變換使時域變頻域後再將卷積相加,可以利用FFT來改進實時性,提升速度
上面就是fir濾波器的簡述
第二個圖片上傳不了,直接給鏈接
;amp;z=0tn=baiduimagedetailword=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7in=12708cl=2cm=1sc=0lm=-1pn=0rn=1di=2607528304ln=1054fr=
圖中的Z-1是延時,iir濾波器也叫無限衝擊響應濾波器,是有反饋的,
圖中的是一階的,相對fir濾波器來說,iir濾波器可以用較低的階數來獲得較好的濾波特效。但是其相位特性較差。
鑒於實用性,還是建議樓主去圖書館借書看,百度不可能得到確實的方案,
樓主可以去借「數字信號處理」的書,國外的中譯本就有詳細介紹fir和iir以及fft還有其他變換,國內的dsp大都幾乎是dsp用戶手冊的中譯本,對上述問題都是很簡陋地帶過,不予置評。
本人推薦一本書在上面的dsp專欄有下載,40多M,叫DSP演算法、應用和設計,本人有這本實體書,寫的較好
如何用C語言實現低通濾波器
float middle_filter(float middle_value [] , intcount)
{
float sample_value, data;
int i, j;
for (i=1; i for(j=count-1; j=i,–j){
if(middle_value[j-1]=middle_value[j]{
data=middle_value[j-1];
middle_value[j-1]=middle_value[j]
middle_value[j]=data;
}
}
sample_value=middle_value(count-1)/2];
return(sample_value);
}
【原創】C++實現IIR二階數字濾波器(一)
如圖Fig1所示,是IIR二階數字濾波器的數學計算公式
轉換到離散域,計算公式如下
濾波器主要有以下幾種:高通/低通/帶通。下分別說明此三種濾波器的系統的求取方法。
通常,對一個濾波器的要求,我們主要給出以下技術規格:中心頻率frequency,採樣頻率sampleRate,增益dBgain,品質因數Q。
為計算方便,先定義以下幾個值:
高通濾波器係數的計算:
採樣原始信號為一個正弦信號和一個直流分量的相加。直流分量的幅值為1,正弦信號周期為1s,幅值也為1。
初始化採樣信號
首先定義數字濾波器的結構體
初始化濾波器,這裡我們選擇二階帶通濾波器做測試
其中,Init_Filter函數定義如下
DSP濾波器函數
使用濾波器函數濾波原始採樣信號
m_signal採樣信號如下,由於包含直流分量1,所以它的幅值由正弦信號的(-1,1)沿Y軸向上偏移1位變成(0,2)
濾波後的信號m_signal_filter如下所示
通過上述實驗驗證了我們給出的二階帶通濾波器演算法的有效性,但是我們濾波後的信號其實並不是真正的正弦信號,而是一個無限逼近正弦的信號,這是由於以下幾個原因造成的
1)採樣時間:採樣速率越高,信號失真越小
2)計算精度:計算機處理信號時在存儲浮點數會出現一定誤差
3)演算法精度:演算法本身就有精度誤差
改進:
1)讀者們可以自行提高採樣速率,去驗證採樣速率對信號誤差的影響,評判標準可以使用均方根誤差
2)讀者們還可以通過更改中心頻率,品質因子,選擇不同的濾波器類型測試對信號的影響
求脈衝響應不變法設計Elliptic型IIR數字低通濾波器
1-1一.試用MATLAB設計一巴特沃斯低通數字濾波器,要求通帶截至頻率Wp=30HZ,阻帶截至頻率為Ws=35HZ,通帶衰減不大於0.5DB,阻帶衰減不小於40DB,抽樣頻Fs=100HZ。
代碼為:
fp = 30;
fs = 35;
Fs = 100;
wp = 2*pi*fp/Fs;
ws = 2*pi*fs/Fs;
wp = tan(wp/2);
ws = tan(ws/2); % 通帶最大衰減為0.5dB,阻帶最小衰減為40dB
[N, wn] = buttord(wp, ws, 0.5, 40, ‘s’); % 模擬低通濾波器極零點
[z, p, k] = buttap(N); % 由極零點獲得轉移函數參數
[b, a] = zp2tf(z, p, k); % 由原型濾波器獲得實際低通濾波器
[B, A] = lp2lp(b, a, wp);
[bz, az] = bilinear(B, A, .5);
還有三句。。。給分後給你
原創文章,作者:FMWV,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/146111.html