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、另一个指标叫做阻带,频率大于此值能够保证衰减大于某值