A. c語言中值濾波問題
1. 是規定做中值濾波的點不含邊緣的點(取決於中值濾波窗口大小)。 2,對圖像邊緣部分的信息進行鏡像處理。
B. 如何用C語言來實現數字濾波器
用C語言實現,希望能給出個完整的已調試好程序,不甚感謝,給你20分問題補充:例子中9、2、14有誤,應該是11、2、14
太麻煩了
我只編了一
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演算法、應用和設計,本人有這本實體書,寫的較好
D. 需要一些c語言寫得經典濾波,pid控制,模糊控制的演算法。
這個世界沒有免費的晚餐,還是多看資料,自己動手吧。 下面資料僅供參考
http://wenku..com/view/8466a429cfc789eb172dc86c.html
http://wenku..com/view/89b366e9e009581b6bd9ebf2.html
http://wenku..com/view/8e9d022f2af90242a895e593.html
http://wenku..com/view/55d3532f7375a417866f8fed.html
http://wenku..com/view/bb24150d76c66137ee0619dc.html
http://wenku..com/view/5b0fbce0524de518964b7ddd.html
http://wenku..com/view/90a2edf49e314332396893d3.html
E. 如何用C語言實現低通濾波器
floatmiddle_filter(floatmiddle_value[],intcount)
{
floatsample_value,data;
inti,j;
for(i=1;ifor(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);
}
F. 二階濾波器用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"
G. Re:請問如何用C語言實現低通濾波器
做這種東西建議用MATLAB,直接調用函數,比較方便,而且MATLAB就專門干這個的,合理利用是必要的
這個估計需要詳細的說明才弄的了去硬之城看看吧或許有人會。
H. 給定一個信號s,包括高頻、低頻成份,現在做一個低通濾波器對信號進行濾波,求c語言程序,急急急!
教你實現方法吧:
第一步:你需要採用MATLAB 設計濾波器的脈沖響應序列,如記為h(n) = [ h1,h2,... hN]
第二步:c 語言實現的是 y(n) = h(n) 卷積x(n) 其中h(n)和x(n)都是向量
詳細代碼很簡單,自己來吧。
I. 請教C語言卡爾曼濾波演算法
網上能找到一些程序。
例如,卡爾曼濾波簡介+ 演算法實現代碼 :
http://blog.21ic.com/user1/349/archives/2009/55947.html
較詳細地 提供了 C 和 C++ 程序。可以同他的方法比較一下,如果結果接近,
則你的演算法沒問題。
J. 巴特沃斯濾波器c語言實現
說的很對,濾波玩的就是增益(衰減)變化,不同的頻率,不同的增益(衰減)。稱幅頻曲線。
1、巴特奧斯濾波器的截止頻率指-3db通頻帶頻率,也就是在這個頻率以內保證暢通(通帶)。
2、另一個指標叫做阻帶,頻率大於此值能夠保證衰減大於某值