濾波演算法c
㈠ 求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濾波器的簡述
第二個圖片上傳不了,直接給鏈接
http://image..com/i?ct=503316480&z=0&tn=imagedetail&word=%D2%BB%BD%D7iir%C2%CB%B2%A8%C6%F7&in=12708&cl=2&cm=1&sc=0&lm=-1&pn=0&rn=1&di=2607528304&ln=1054&fr=
圖中的Z-1是延時,iir濾波器也叫無限沖擊響應濾波器,是有反饋的,
圖中的是一階的,相對fir濾波器來說,iir濾波器可以用較低的階數來獲得較好的濾波特效。但是其相位特性較差。
鑒於實用性,還是建議樓主去圖書館借書看,網路不可能得到確實的方案,
樓主可以去借「數字信號處理」的書,國外的中譯本就有詳細介紹fir和iir以及fft還有其他變換,國內的dsp大都幾乎是dsp用戶手冊的中譯本,對上述問題都是很簡陋地帶過,不予置評。
本人推薦一本書在www.ouravr.com上面的dsp專欄有下載,40多M,叫DSP演算法、應用和設計,本人有這本實體書,寫的較好
㈡ C51能不能實現卡爾曼濾波,如果可以能不能給我代碼
卡爾曼濾波只是一個演算法,而C51是基於標准C語言擴展而來的,你只要明白卡爾曼濾波的數學表達演算法,就能用C語言寫出來卡爾曼濾波的程序,所以,C語言完全可以寫出來卡爾曼濾波演算法,C51自然也就能.
但是,這里有個但是!!!
C51雖然是基於標准C語言擴展的,但是,C51是用在51內核單片機上的,而以51內核為內核組成的單片機,大都硬體架構簡單,內存容量小,沒有專用的硬體乘法器,而且是8位的,基於以上原因,在實際應用中,51單片機是無法完成卡爾曼濾波的.
1 是沒有專用硬體乘法/除法器
2 卡爾曼濾波是一種遞歸演算法,需要極大的內存支持,51一般只有幾K內存,不足以支持龐大的
卡爾曼濾波.演算法
所以,如果你一定要卡爾曼濾波演算法,換個強大的MCU吧
㈢ 什麼叫卡爾曼濾波演算法其序貫演算法
卡爾曼濾波演算法(Kalman filtering)一種利用線性系統狀態方程,通過系統輸入輸出觀測數據,對系統狀態進行最優估計的演算法。由於觀測數據中包括系統中的雜訊和干擾的影響,所以最優估計也可看作是濾波過程。
序貫演算法又叫序貫相似性檢測演算法,是指圖像匹配技術是根據已知的圖像模塊(模板圖)在另一幅圖像(搜索圖)中尋找相應或相近模塊的過程,它是計算機視覺和模式識別中的基本手段。已在衛星遙感、空間飛行器的自動導航、機器人視覺、氣象雲圖分析及醫學x射線圖片處理等許多領域中得到了廣泛的應用。研究表明,圖像匹配的速度主要取決於匹配演算法的搜索策略。
數據濾波是去除雜訊還原真實數據的一種數據處理技術, Kalman濾波在測量方差已知的情況下能夠從一系列存在測量雜訊的數據中,估計動態系統的狀態. 由於, 它便於計算機編程實現, 並能夠對現場採集的數據進行實時的更新和處理, Kalman濾波是目前應用最為廣泛的濾波方法, 在通信, 導航, 制導與控制等多領域得到了較好的應用。
㈣ 請教C語言卡爾曼濾波演算法
網上能找到一些程序。
例如,卡爾曼濾波簡介+ 演算法實現代碼 :
http://blog.21ic.com/user1/349/archives/2009/55947.html
較詳細地 提供了 C 和 C++ 程序。可以同他的方法比較一下,如果結果接近,
則你的演算法沒問題。
㈤ 二階濾波器用C語言怎麼寫
這個可比你想像的復雜多了,s是個復變數,1/(s+1)極點在-1,要想用C語言寫,必須理解清楚下面幾個問題:
1、輸入必須是個有限序列,比如(x+yi),x和y分別是兩個長度為N的數組
2、要過濾的頻率,必須是個整型值,或者是個整型區間
3、輸出結果同樣是兩個長度為N的數組(p+qi)
4、整個程序需要使用最基本的復數運算,這一點C語言本身不提供,必須手工寫復函數運算庫
5、實現的時候具體演算法還需要編,這里才是你問題的核心。
我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差別很大:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "complex.h"
extern "C" {
// Discrete Fourier Transform (Basic Version, Without Any Enhancement)
// return - Without Special Meaning, constantly, zero
int DFT (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);
CComplex F, X, T, W; int n, i;
long N = abs(count); long Inversing = count < 0? 1: -1;
for(n = 0; n < N ; n++){ // compute from line 0 to N-1
F = CComplex(0.0f, 0.0f); // clear a line
for(i = 0; i < N; i++) {
T = input[i];
W = HarmonicPI2(Inversing * n * i, N);
X = T * W;
F += X; // fininshing a line
}//next i
// save data to outpus
memcpy(output + n, &F, sizeof(F));
}//next n
return 0;
}//end DFT
int fft (long count, CComplex * input, CComplex * output)
{
assert(count);
assert(input);
assert(output);
int N = abs(count); long Inversing = count < 0? -1: 1;
if (N % 2 || N < 5) return DFT(count, input, output);
long N2 = N / 2;
CComplex * iEven = new CComplex[N2]; memset(iEven, 0, sizeof(CComplex) * N2);
CComplex * oEven = new CComplex[N2]; memset(oEven, 0, sizeof(CComplex) * N2);
CComplex * iOdd = new CComplex[N2]; memset(iOdd , 0, sizeof(CComplex) * N2);
CComplex * oOdd = new CComplex[N2]; memset(oOdd , 0, sizeof(CComplex) * N2);
int i = 0; CComplex W;
for(i = 0; i < N2; i++) {
iEven[i] = input[i * 2];
iOdd [i] = input[i * 2 + 1];
}//next i
fft(N2 * Inversing, iEven, oEven);
fft(N2 * Inversing, iOdd, oOdd );
for(i = 0; i < N2; i++) {
W = HarmonicPI2(Inversing * (- i), N);
output[i] = oEven[i] + W * oOdd[i];
output[i + N2] = oEven[i] - W * oOdd[i];
}//next i
return 0;
}//end FFT
void __stdcall FFT(
long N, // Serial Length, N > 0 for DFT, N < 0 for iDFT - inversed Discrete Fourier Transform
double * inputReal, double * inputImaginary, // inputs
double * AmplitudeFrequences, double * PhaseFrequences) // outputs
{
if (N == 0) return;
if (!inputReal && !inputImaginary) return;
short n = abs(N);
CComplex * input = new CComplex[n]; memset(input, 0, sizeof(CComplex) * n);
CComplex * output= new CComplex[n]; memset(output,0, sizeof(CComplex) * n);
double rl = 0.0f, im = 0.0f; int i = 0;
for (i = 0; i < n; i++) {
rl = 0.0f; im = 0.0f;
if (inputReal) rl = inputReal[i];
if (inputImaginary) im = inputImaginary[i];
input[i] = CComplex(rl, im);
}//next i
int f = fft(N, input, output);
double factor = n;
//factor = sqrt(factor);
if (N > 0)
factor = 1.0f;
else
factor = 1.0f / factor;
//end if
for (i = 0; i < n; i++) {
if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor;
if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor;
}//next i
delete [] output;
delete [] input;
return ;
}//end FFT
int __cdecl main(int argc, char * argv[])
{
fprintf(stderr, "%s usage:\n", argv[0]);
fprintf(stderr, "Public Declare Sub FFT Lib \"wfft.exe\" \
(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \
ByRef freqAmplitude As Double, ByRef freqPhase As Double)");
return 0;
}//end main
};//end extern "C"
㈥ 什麼是濾波演算法
卡爾曼濾波器(Kalman Filter)是一個最優化自回歸數據處理演算法(optimal recursive data processing algorithm)。對於解決很大部分的問題,他是最優,效率最高甚至是最有用的。他的廣泛應用已經超過30年,包括機器人導航,控制,感測器數據融合甚至在軍事方面的雷達系統以及導彈追蹤等等。近年來更被應用於計算機圖像處理,例如頭臉識別,圖像分割,圖像邊緣檢測等等。
最佳線性濾波理論起源於40年代美國科學家Wiener和前蘇聯科學家Kолмогоров等人的研究工作,後人統稱為維納濾波理論。從理論上說,維納濾波的最大缺點是必須用到無限過去的數據,不適用於實時處理。為了克服這一缺點,60年代Kalman把狀態空間模型引入濾波理論,並導出了一套遞推估計演算法,後人稱之為卡爾曼濾波理論。卡爾曼濾波是以最小均方誤差為估計的最佳准則,來尋求一套遞推估計的演算法,其基本思想是:採用信號與雜訊的狀態空間模型,利用前一時刻地估計值和現時刻的觀測值來更新對狀態變數的估計,求出現時刻的估計值。它適合於實時處理和計算機運算。
現設線性時變系統的離散狀態防城和觀測方程為:
X(k) = F(k,k-1)·X(k-1)+T(k,k-1)·U(k-1)
Y(k) = H(k)·X(k)+N(k)
其中
X(k)和Y(k)分別是k時刻的狀態矢量和觀測矢量
F(k,k-1)為狀態轉移矩陣
U(k)為k時刻動態雜訊
T(k,k-1)為系統控制矩陣
H(k)為k時刻觀測矩陣
N(k)為k時刻觀測雜訊
則卡爾曼濾波的演算法流程為:
預估計X(k)^= F(k,k-1)·X(k-1)
計算預估計協方差矩陣
C(k)^=F(k,k-1)×C(k)×F(k,k-1)'+T(k,k-1)×Q(k)×T(k,k-1)'
Q(k) = U(k)×U(k)'
計算卡爾曼增益矩陣
K(k) = C(k)^×H(k)'×[H(k)×C(k)^×H(k)'+R(k)]^(-1)
R(k) = N(k)×N(k)'
更新估計
X(k)~=X(k)^+K(k)×[Y(k)-H(k)×X(k)^]
計算更新後估計協防差矩陣
C(k)~ = [I-K(k)×H(k)]×C(k)^×[I-K(k)×H(k)]'+K(k)×R(k)×K(k)'
X(k+1) = X(k)~
C(k+1) = C(k)~
㈦ C語言卡爾曼濾波演算法求教
Optimal_value = 23; //上次最優值,根據環境開始可以隨便設一個大概的數
{
for(i=0;i<10;i++)
這里多了一個花括弧也能運行?
㈧ Kalman 濾波的數學模型C語言編程問題
[KEST,L,P
=卡爾曼(SYS,青年,護士,NN)
卡爾曼濾波器的信號模型
X(K)=
A
*
X(k-1)+
W(K)
/>
Y(K)=
C
*
X(K)+
V(K)
W和V上的兩個W和V
E
{WW「
}
=
QN,這是系統雜訊的協方差矩陣;
E
{VV'}
=
RN,測量雜訊的協方差矩陣;
E
{WV'}
=
NN,這一下應該從字面上相互系統的雜訊和觀測雜訊的協方差矩陣;
白雜訊均值為0,所以上述的幾個值?的自相關和互相關函數;
系統給定的系統模型;
㈨ c語言中值濾波問題
1. 是規定做中值濾波的點不含邊緣的點(取決於中值濾波窗口大小)。 2,對圖像邊緣部分的信息進行鏡像處理。
㈩ lc濾波的計算
上圖是常用經典演算法,巴特沃斯型濾波電路的基本參數,截止頻率為1/2π HZ(0.159),特徵阻抗1Ω,首先要確定需要幾階,比如二階,先歸一化,再變換截止頻率,M=200/0.159 L(new)=L(old)/M,C(new)=C(old)/M,再變換特徵阻抗K=50/1,L(new)=L(old)*K,C(new)=C(old)/K,算出來的值便是最終待設計LC濾波的值。
可選擇 定K型濾波器則 L=R/(2πF)=1.5K/6.28*4K=59.7mH;
C=1/(2πRF)=1/1.5K*6.28*4K=26.54nF
也可選擇巴特沃斯型 L=2Sin(2k-1/2n)π*R/(2πF)=84.4mH
C=2Sin(2k-1/2n)π/(2πRF)=37.53nF (其中k,n=2)