2010-04-02 37 views
6

Tôi cần triển khai bộ lọc trung bình trên bộ dữ liệu, nhưng tôi không có quyền truy cập vào hộp công cụ xử lý tín hiệu. Có cách nào để làm điều này mà không cần sử dụng vòng lặp for? Dưới đây là đoạn code tôi đã có làm việc:Bộ lọc trung bình trong MATLAB không có vòng lặp hoặc hộp công cụ xử lý tín hiệu

x=0:.1:10*pi;  
noise=0.5*(rand(1,length(x))-0.5); 
y=sin(x)+noise;  %generate noisy signal 
a=10;    %specify moving window size 
my=zeros(1,length(y)-a); 
for n=a/2+1:length(y)-a/2 
    my(n-a/2)=mean(y(n-a/2:n+a/2));  %calculate mean for each window 
end 
mx=x(a/2+1:end-a/2);     %truncate x array to match 

plot(x,y) 
hold on 
plot(mx,my,'r') 

EDIT:

Sau khi triển khai giải pháp Merv của, được xây dựng trong phương pháp lọc chậm tín hiệu ban đầu. Có cách nào để giái quyết vấn đề này không? alt text

Trả lời

5

Sử dụng được xây dựng trong FILTER chức năng

%# generate noisy signal 
x = sin(0:.1:10*pi); 
x = x + 0.5*(rand(1,length(x))-0.5); 

%# moving average smoothing 
window = 15; 
h = ones(window,1)/window; 
y = filter(h, 1, x); 

%# plot 
subplot(211), plot(x), ylim([-1 1]), title('noisy') 
subplot(212), plot(y), ylim([-1 1]), title('filtered') 

Để giải quyết vấn đề lag, hãy thử một cái gì đó như thế này:

s = ceil(window/2); 
yy = y(s:end); 
n = length(x); 
plot(1:n, x, 'b'), hold on, plot(1:n-s+1, yy,'r'), hold off 
legend({'noisy' 'filtered'}) 

alt text http://img171.imageshack.us/img171/4510/45062995.png

Các vấn đề liên quan