Первый FIR фильтр на Си
Давным давно я писал о как синтезировать и рассмотреть характеристики КИХ (он
Давным давно я писал о как синтезировать и рассмотреть характеристики КИХ (он
Линейная свертка - одна из фундаментальных операций цифровой обработки сигналов. Реакция системы с импульсной характеристикой hi на входной сигнал xi вычисляется как свертка этих двух последовательностей.
Например имеем:
{hi}={h0, h1, h2, h3}
{xl}={x0, x1, x2}
В ходе работы с цифровыми (и не только) сигналами часто необходимо найти нули и плюсы системы. Кстати буржуи зовут числитель numerator`ом,а знаменатель - denumerator`ом. Стоит знать это при работе с их материалами и справочной системой Matlab.
Ближе к делу. В матлаб можно очень просто найти нули и полюсы. Для этого вам необходима переменная со значениями коэффициентов полинома числителя и знаменателя.
num = 1; % числитель den = [1 -1]; % знаменатель
Т.е. вот такая дробь:
sys =
1
-----
z - 1
Одной из самых распространённых задач является выявление в спектре сигнала составляющих. Делается это для того чтобы отфильтровать сигнал. Ведь иногда по одной линии передаётся далеко не один сигнал, в то время как обрабатывать каждый из них нужно по разному.
Рассмотрим простейший случай такого анализа в Matlab.
Сформируем временную сетку:
>> t = 0:0.001:0.6;
Теперь зададим сигнал для тренировок:
>> x = sin(2*pi*50*t) + sin(2*pi*120*t);
Рассмотрим процесс фильтрации сигнала при помощи цифрового фильтра в Matlab.
Открываем матлаб и начинаем выполнять функции.
Сначала зададим параметры.
Fs=100; % частота дискретизации tmax=5; % промежуток рассматриваемого времени Nsamps = tmax*Fs; % рассматриваемый период
Задаём временную шкалу для нашего сигнала:
t = 1/Fs:1/Fs:tmax;
Теперь задаём сигнал и помеху:
s1 = 10*cos(2*pi*t); % сигнал s2 = 2*cos(20*pi*t + pi/4); % высокочастотная помеха s3 = s1 + s2; % всё вместе
Выведем на экран сигналы.
Matlab программа с невероятными возможностями, но как и любое прикладное приложение, рано или поздно программу созданную в матлабе нужно переписать для использования в вашем приложении.
Я играю цифровыми фильтрами. При работе с ними нужно использовать свёртку или преобразование Фурье и прочие специфические функции. Естественно писать их с нуля смысла особого нет, но и искать вам придётся скорее всего долго..
И тут апогеем творчества MathWorks стал Matlab Coder который позволяет сгенерировать вам код на C/C++ из функции матлаба.
Под теоремой Парсеваля понимают: сумма квадрата функции равна сумме квадрата преобразования.
Т.е.
В дискретном виде теорему записывают таким образом:
Зададим количество отсчётов:
N = 100;
Заполним случайными числами:
x = randn(1,N);
Посчитаем сумму квадратов:
Фильтры с конечной импульсной характеристикой имеют структурную форму вида:
В силу своего строения они всегда устойчивы, что безусловно является плюсом, но содержат больше звеньев по сравнению с аналогичными фильтрами с бесконечной импульсной характеристикой.
Приступим к синтезу и анализу характеристик КИХ фильтра в пакете matlab.
Будем синтезировать фильтр нижних частот с частотой среза 0.2 (частота относительно частоты дискретизации).
1. Вводим значения отсчетов импульсной характеристики
>> h=[3 4 8];
2. Вводим значения отсчетов сигнала:
>> x=[3 2 -2 1 -1];
3. Вычисляем линейную свертку:
>> y1=conv(h,x)
y1 = 9 18 26 11 -15 4 -8
4. Определяем общий период для вычисления циклической свертки: