ЦОС. Пытаюсь понять принцип цифровой фильтрации сигнала. Подскажите пожалуйста правильна ли в принципе моя логика.
Код на MATLAB
1. Создадим сигнал
for q=1:1:1024;
mass(q)=sin(2*pi/512*q); % 512 Гц
mass(q)=mass(q)+sin(2*pi/256*q);% 256 Гц
mass(q)=mass(q)+sin(2*pi/128*q);% 128 Гц
mass(q)=mass(q)+sin(2*pi/64*q); % 64 Гц
mass(q)=mass(q)+sin(2*pi/32*q); % 32 Гц
mass(q)=mass(q)+4;
end;
plot (mass);
2. Проанализируем сигнал с помощью ДПФ
dp=fft(mass); % ДПФ
Am=sqrt(real(dp).^2 + imag(dp).^2)/512; % Амплитуда
%(Первая из них видимо – постоянная, а дальше по частотам ? )
plot(Am(1:256));
%title('Frequency content of y'); xlabel('frequency (Hz)');
Как корректно отобразить амплитудно-частотный график ?
3. Создадим произвольный фильтр с помощью fdatool (лишь бы наглядно давил какой-то диапазон)
Через экспортирование (File->Export…) получаем коэффициенты фильтра:
FiL = [
1.0000 -0.0000 -1.0000 1.0000 -0.7044 0.7096 1.0000 1.6212 1.0000 1.0000 -0.0894 0.7528
1.0000 -1.9288 1.0000 1.0000 -1.2281 0.8118 1.0000 1.1771 1.0000 1.0000 0.3301 0.8700
1.0000 -1.8281 1.0000 1.0000 -1.5012 0.9159 1.0000 0.9892 1.0000 1.0000 0.5205 0.9619
1.0000 -1.7785 1.0000 1.0000 -1.6154 0.9770
];
for q=1:1:42; FiL2(q)=FiL(q); end;
for q=43:1:1024; FiL2(q)=0; end;
Здесь я расширяю размерность фильтра до размерности сигнала – это нужно ?
4. Отфильтруем сигнал - сворачиваем сигнал с фильтром
w = conv(mass,FiL2);
dp2=fft(w); % ДПФ
Am2=sqrt(real(dp2).^2 + imag(dp2).^2)/512;
plot(Am2(2:50));
clear d Am dp mass w FiL dp2 Am2;
I. Смысл моего примера (вопроса) в том, что я сгенерировал, как мне кажется, чистейший сигнал: частота дискретизации кратная частотам заложенным в сигнале. Как я думал на амплитудно-частотном графике должен был бы получиться "аккуратный частокол" с единичными амплитудами (а у меня первый коэффициент куда-то ввысь улетает постоянно). Да и формулу нахождения амплитуд я «подгонял под ответ». Затем я собирался создать фильтр (какие коэффициенты выдает тулза Матлаба fdatool я не знаю (кстати в чем (какая прога или тулза) лучше всего фильтры проектировать)), который наглядно «сбивает» какие-то частоты. Коэффициенты фильтра я получил и свернул их с сигналом. Результат стал анализировать с помощью ДПФ – который вывел мне какие-то еще левые частоты, а «сбиваемые» частоты в большинстве случаев «не пострадали». Вот я и спрашиваю: что я не так делаю и может где уже статья есть по данному вопросу (Читать книги типа Айфичера у меня уже нервов не хватает).
II. А первый коэффициент после выполнения ДПФ (для сигнала) является уже частотой или это какая-то постоянная величина не имеющая отношения к спектру, которая как-то отображается на графике (каково ее место на амплитудно-частотном график ) ?
III. Амплитуда высчитывается по такой формуле как у меня (в разных книгах - разные формулы)
Am=sqrt(real(dp).^2 + imag(dp).^2)/512;
Амплитуда = квадратный корень (сумма квадратов действительной и мнимой части ДПФ) / половину частоты дескритизации ?
IV. А почему фильтрацию сигнала не делают по такой схеме: в результате ДПФ получаем значения частот и амплитуд, значит "ненужные" (фильтруемые) частоты можно просто выкинуть, а затем через функцию синуса создать уже отфильтрованный сигнал.
ЗЫ: Я и с MATLAB и с ЦОС работаю впервые
ЗЗЫ: Если есть какая-либо статься написанная по такой схеме (как создать, проанализировать и увидеть ) подскажите пожалуйста.