資源簡介
基于滑動窗口可以實現對一維曲線平滑及降噪,根據有用信號的頻率,選取合適的窗口寬度。
代碼片段和文件信息
function?avin=smooth(indist)??%in為輸入的二維矩陣,dist為窗口的大小
if?dist?==?1???%判定窗口的大小是否為1,如果為1則返回
??avin=in;
??return
end
[nm]=size(in);?%?將輸入矩陣0軸和1軸輸入給n,m
if?n?==?1???????%?如果n=1,則將矩陣轉置
??in=in‘;
??[nm]=deal(mn);??%?交換nm的值
??flip=1;
else
??flip=0;
end
in=full(in);
%???????創建濾波器
idist=2*fix((dist-1)/2)+1;????%考慮窗口長度是奇數偶數的兩種情況,因為窗口的寬度總是為奇數,如果輸入的是偶數程序會將偶數轉換成奇數
xdist=dist-idist;?????????????
if?xdist?==?0??????????????????%如果濾波器窗口數目是奇數的情況執行以下操作
??weights=ones(dist1)/dist;???%創建一個平均濾波器,濾波器窗口的寬度為輸入的窗口輸入
else???????????????????????????%?如果濾波器窗口數目是偶數的情況執行以下操作
??weights=ones(idist+21);?????%將濾波器的窗口數目轉化成dist+1成為奇數,并使每一個元素等于1
??weights([1end])=0.5*xdist;??%?使濾波器首尾元素等于0.5
??weights=weights/dist;????????%使濾波器歸一化處理
end
if?length(weights)?>?n???????%判定濾波器窗口數目是否大于輸入數列的長度,一般情況下窗口數目都是遠遠小于數列的長度,所以該判定模塊一般都是跳過
??avin=mean(in);
??avin=avin(ones(n1):);
??return
end
append=(length(weights)-1)/2;??%append等于濾波器的一半大小
avin=zeros(nm);???????????????%?構建一個n*m的0矩陣
for?ii=1:size(in2)???????????%?求取輸入陣列的列數,對每一列采取循環的方式分別進行濾波
??temp1=conv(in(:ii)weights);??%?把濾波器和輸入數列進行卷積運算,結果是一個長度為(輸入數列長度+2*append)的數列
??avin(:ii)=temp1(append+1:end-append);???%?截取temp1數列從append+1到end-append中間部分的數列,此時長度應該等于輸入數列的長度
end
%???????對兩端邊界值進行修正
for?ii=1:append???????????????????????????????
??%fact=1/sum(weights(1:end-append-1+ii));
??%avin(ii:)=avin(ii:)*fact;
??%avin(end-ii+1:)=avin(end-ii+1:)*fact;
??fact=sum(weights(1:append+1-ii));??????????%計算修訂因子fact,邊界不同位置上的數采用不同的修正因子
??avin(ii:)=avin(ii:)+in(ii:)*fact;???????%修訂輸入數列的前邊界的值
??avin(end-ii+1:)=avin(end-ii+1:)+in(end-ii+1:)*fact;???%修訂輸入數列后邊界的值
end
if?flip???????????????????????????????%如果輸入的n等于1,則將結果轉置
??avin=avin‘;
end
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????2129??2012-11-21?14:54??smooth.m
-----------?---------??----------?-----??----
?????????????????2129????????????????????1
- 上一篇:仿真開關磁阻電機
- 下一篇:手寫體數字識別的訓練數據庫
評論
共有 條評論