当我们使用1200PLC进行滤波均值计算时,可以采用以下步骤进行程序编写:
1 首先,我们需要将采集到的原始数据存储至一个数组中,以便后续的计算。
2 接着,我们需要定义一个变量来存储滑动窗口的大小,通常情况下,一个合适的窗口大小是根据实际应用场景来确定的。
3 然后,我们可以通过循环语句将窗口内的数据进行累加,并计算出平均值。在每次循环中,我们需要将最早加入窗口的数据删除,并将最新采集到的数据添加至窗口中。
4 最后,我们需要将计算出的均值结果输出或存储至某个寄存器、数据存储器、或者其他设备中供后续使用。
比如,下面是一个示例程序:
```LD M100 ;开始存储原始数据
LD D100 ;将D100的值存储到M100中
ADD X0 ;将X0中的值加1
MOV D100, M[X0] ;将M[X0]的值存储到D100中
CMP X0, K1N10 ;判断X0是否大于等于K1N10
JMPE ELSE ;如果是,则跳转至ELSE
AVG: ;均值计算过程
MOV D10, D100 ;将D100的值存储到D10中
ADD D20, D10 ;将D10加到D20中
ADD X1, K1 ;将X1加1
CMP X1, K2N10 ;判断X1是否大于等于K2N10
JMPE OUTPUT ;如果是,则跳转至OUTPUT
MOV D100, M[X1] ;将新采集的数据存储到D100中
SUB D20, D[K1] ;将最早加入窗口的数据删除
JMP AVG ;重复执行均值计算过程
OUTPUT:
DIV D20, K1N10 ;计算出平均值
ST D30, M[100] ;将结果存储至M100寄存器中
JMP START ;回到程序开始处
ELSE:
MOV X0, K1 ;将X0重置为窗口大小
MOV D20, K0 ;将累加器清零
JMP AVG ;执行均值计算
h = freqs(b, a, w) 根据系数向量计算返回滤波器的复频域响应。
调用这个低通滤波器时,使用下面的函数
sf=filter(a,b,s); %s为需滤波的数据,sf经过你设计的低通滤波器以后的新数据
方法一:filter2
clear all;
I=imread('lenabmp');
%读入预处理图像
imshow(I)
%显示预处理图像
K1=filter2(fspecial('average',3),I)/255;
%进行33均值滤波
K2=filter2(fspecial('average',5),I)/255;
%进行55均值滤波
K3=filter2(fspecial('average',7),I)/255;
%进行77均值滤波
figure,imshow(K1)
figure,imshow(K2)
figure,imshow(K3)
方法二:双循环语句,移动平均法
%均值滤波
clc,clear;
f=imread('lenabmp');
subplot(121),imshow(f),title('原图');
f1=imnoise(f,'gaussian',0002,00008);
%subplot(222),imshow(f1),title('添加高斯噪声图');
k1=floor(3/2)+1;
k2=floor(3/2)+1;
X=f1;
[M,N]=size(X);
uint8 Y=zeros(M,N);
funBox=zeros(3,3);
for i=1:M-3
for j=1:N-3
funBox=X(i:i+3,j:j+3);
s=sum(funBox(:));
h=s/9;
Y(i+k1,j+k2)=h;
end;
end;
Y=Y/255;
subplot(122),imshow(Y),title('均值滤波');
实现图:
将模拟频率转化为数字频率,设取样时间为T(要满足抽样定理) Ωp=2πfpT Ωs=2πfsT 过渡带宽度△Ω=Ωp-Ωs 阻带衰减已经超过74db,要选用Kaiser窗了,Kaiser的参数可变,要根据公式确定滤波器的参数一般都选用Ⅰ型线性相位滤波器即滤波器阶数M为偶数,程序如下: wp=;ws=;Ap=1;As=100; Rp=1-10^(-005Ap);Rs=10^(-005As); f=[fp fs]; a=[0 1]; dev=[Rp Rs]; [M,wc,beta,ftype]=kaiserord(f,a,dev); M=mod(M,2)+M; h=fir1(M,wc,ftype,kaiser(M+1,beta)); omega=linspace(0,pi,512); mag=freqz(h,[1],omega); plot(omega/pi,20log10(abs(mag))); grid; omega1=linspace(0,wp,512); h1=freqz(h,[1],omega1); omega2=linspace(ws,pi,512); h2=freqz(h,[1],omega2); fprintf('Ap=%4f\n',-20log10(min(abs(h1)))); fprintf('As=%4f\n',-20log10(max(abs(h2)))); 运行程序可以得到滤波器的通阻带衰减,画出频率响应,若同阻带衰减不满足要求还可以使用滤波器的优化,一般使用的等波纹FIR进行优化
这个我刚好做过一个滤波器,事实上对时域信号做FFT,截取一定点数再做逆FFT相当于理想滤波。设计滤波器代码如下:
f1=100;f2=200;%待滤波正弦信号频率
fs=2000;%采样频率
m=(03f1)/(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(ffs/(2pi),20log10(abs(h)))%参数分别是频率与幅值
xlabel('频率/赫兹');ylabel('增益/分贝');title('滤波器的增益响应');
figure(2)
subplot(211)
t=0:1/fs:05;%定义时间范围和步长
s=sin(2pif1t)+sin(2pif2t);%滤波前信号
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([02 05 -2 2]);%限定图像坐标范围
subplot(212)
Fsf=fft(sf,512);%滤波后的信号频域图
AFsf=abs(Fsf);%信号频域图的幅值
f=(0:255)fs/512;%频率采样
plot(f,AFsf(1:256))%滤波后的信号频域图
xlabel('频率/赫兹');ylabel('幅度');title('信号滤波后频域图');
先确定的带阻归一化频率,就是你要组织的频带范围,比如采样频率fs=100Hz,带阻是bandstop=20Hz~40Hz,那么Wn=bandstop2/fs=[04,08]
接着,窗函数滤波器,即FIR有限冲激相应滤波器,这样取得
b=fir1(n,Wn,'stop'),n 是一个合适的阶数,适当选取,要求不高,Wn上面取得了,stop表示带阻。
y=filter2(b,x)
x为滤波器输入,y即输出。
低通FIR滤波器的设计就是Wn的设计要根据你的通带上限设置,然后fir1函数里的‘stop’变为‘low’,其它都一样。
以上就是关于1200plc滤波均值怎么写程序全部的内容,包括:1200plc滤波均值怎么写程序、关于matlab中低通滤波器程序、编写用均值滤波去噪的matlab程序,用两种方法实现.(重谢)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)