2016-04-26 1 views
4

Я работаю над фильтрацией сигналов в MATLAB. Я написал сигнал с 3-мя различными частотами:Проектирование узкого полосового фильтра в MATLAB

Fs = 8000;     %// Sampling frequency 
T = 1/Fs;     %// Sample time 
L = 16000;     %// Length of signal 
t = (0:L-1)*T;    %// Time vector 

y = 40*sin(2*pi*50*t) + 500*sin(2*pi*51*t) + 500*sin(2*pi*49*t); 

Signal y

Теперь я хочу, чтобы извлечь сигнал 50 Гц с помощью окна полосовой фильтрации с использованием окна Ханнинга.
Вот мой код, чтобы проектировать фильтр:

function Hd = HannFilter1 

Fs = 8000;   %// Sampling Frequency 

N = 4096;  %// Order 
Fc1 = 49.5;  %// First Cutoff Frequency 
Fc2 = 50.5;  %// Second Cutoff Frequency 
flag = 'scale'; %// Sampling Flag 
win = hann(N+1); 

b = fir1(N, [Fc1 Fc2]/(Fs/2), 'bandpass', win, flag); 
Hd = dfilt.dffir(b); 

После этого, я фильтрации с использованием filter так:

yfilter = filter(Hd.Numerator,1,y); 

NFFT = 2^nextpow2(L); 
Y = fft(yfilter,NFFT)/L; 
f = Fs/2*linspace(0,1,NFFT/2+1); 

figure; 
subplot(2,1,1); 
plot(yfilter); 
subplot(2,1,2); 
plot(f,2*abs(Y(1:NFFT/2+1))) 

filtered Signal

  • Почему этот фильтр не в состоянии извлечь сигнал 50 Гц?
  • Я делаю что-то не так в этой симуляции?
  • Как отфильтровать сигнал 50 Гц?

Какая максимальная частота дискретизации для сигнала 50 Гц? и очень важный вопрос! в реальном мире, как и система балансировки, основной сигнал составляет около 20 Гц, а среда слишком шумная, и фильтрация по моему решению не дает правильного ответа. в этом случае, как я могу использовать или выбрать лучший алгоритм фильтрации?

если моя ставка образца будет 8000Цем и я могу буферный только 20000 образцов, как можно Проектирование узкополосного фильтра?

+0

Это абсурдная полоса пропускания. Вы проверили частотную характеристику фильтра? –

+0

Да, ответ фильтра в порядке, есть забавный момент, что я нашел его! когда я уменьшаю амплитуду сигнала 49 Гц и 51 Гц до 10 (от 500), все отлично работает! Зачем?! –

+0

есть еще один момент! максимум амплитуды отфильтрованного сигнала, сильно связанного с другими сигналами! (49 Гц и 51 Гц), если амплитуда сигнала 49 Гц вырастает до 2000, (от 500), амплитуда результата фильтрации растет! но фиксированная амплитуда основного сигнала (50 Гц)! я сойду с ума !!!!! –

ответ

0

Итак, я решить проблему путем частотой дискретизации уменьшения и увеличения выборки данных с помощью этого кода: (как Matt было сказано)

Fs = 1000;     % Sampling frequency 
T = 1/Fs;      % Sample time 
L = 60000;      % Length of signal 
t = (0:L-1)*T;    % Time vector 

for j=1:20 

r1 = 5 + (1000-5).*rand(1,1); 
r2 = 5 + (1000-5).*rand(1,1); 

y = 10*sin(2*pi*14.8*t) + r1*sin(2*pi*14.2*t) + r2*sin(2*pi*15.5*t) + 1.1*rand(size(t)); 


yfilter = filter(Hd.Numerator,1,y); 
max(yfilter(40000:50000)) 

end 

моего фильтр KAISER (КИЕ Badpass фильтр):

Fs = 1000; % Sampling Frequency 

Fstop1 = 14.2;   % First Stopband Frequency 
Fpass1 = 14.6;   % First Passband Frequency 
Fpass2 = 15;    % Second Passband Frequency 
Fstop2 = 15.2;   % Second Stopband Frequency 
Dstop1 = 1e-06;   % First Stopband Attenuation 
Dpass = 0.057501127785; % Passband Ripple 
Dstop2 = 1e-06;   % Second Stopband Attenuation 
flag = 'scale';   % Sampling Flag 

% Calculate the order from the parameters using KAISERORD. 
[N,Wn,BETA,TYPE] = kaiserord([Fstop1 Fpass1 Fpass2 Fstop2]/(Fs/2), [0 ... 
          1 0], [Dstop1 Dpass Dstop2]); 

% Calculate the coefficients using the FIR1 function. 
b = fir1(N, Wn, TYPE, kaiser(N+1, BETA), flag); 
Hd = dfilt.dffir(b); 

и фильтр амплитуда 20 итерации и случайного сигнала шума является:

max(yfilter(40000:50000)) 

10.01 
10.02 
10.01 
10.00 
10.01 
10.03 
10.01 
10.02 
.... 

что это отличный результат для меня, и отфильтрованного сигнала: Filtered Signal

но есть некоторая проблема:

1- моя длина выборки данных 60000 байт, в другой стороны, частота дискретизации в 1000Hz, я жду за 60 секунд для сбора данных, и это слишком долгое время !!! , когда я уменьшаю длину данных образца примерно до 3000 образцов, результат фильтрации настолько плох, потому что число коэффициентов фильтра составляет около 4097. Как я могу фильтровать свой сигнал, когда его длина составляет 3000 выборок, а коэффициенты фильтра составляют около 4097 байт? когда я уменьшаю коэффициенты фильтра, результат отфильтрованного сигнала становится настолько шумным.

2 - какая наилучшая частота дискретизации для сигнала 15 Гц?

спасибо.