Цифровая фильтрация комплексного сигнала

Все что касается фильтрации
MikhailS
Сообщения: 3
Зарегистрирован: 02 апр 2015, 11:30

Re: Цифровая фильтрация комплексного сигнала

Сообщение MikhailS »

Добрый день.
Передо мной сейчас стоит задача (скорее академическая, чем практическая). В Матлабе задается фильтр комплексными коэффициентами. Необходимо реализовать такой же фильтр на Verilog, а затем сравнить результаты. И вот как это реализовать не совсем представляю. Посоветуйте литературу, или примеры. Спасибо.

Илья
Сообщения: 11
Зарегистрирован: 09 мар 2015, 21:10

Re: Цифровая фильтрация комплексного сигнала

Сообщение Илья »

Какой тип фильтра, какой порядок, какая арифметика (с плавающей точкой или с фиксированной), какая среда разработки?
Вопрос только в реализации на verilog или по матлабу тоже вопросы есть?

Илья
Сообщения: 11
Зарегистрирован: 09 мар 2015, 21:10

Re: Цифровая фильтрация комплексного сигнала

Сообщение Илья »

Вроде разобрался, как рассчитывать комплексные фильтры в Matlab)))

Код: Выделить всё

% Модель для рассчета комплексного
% полосового фильтра
clear all;
close all;
Nfft = 512;             % Длинна БПФ
N = Nfft;               % Кол-во семплов в исходной модели
f_vec = -1:(2/(Nfft-1)):1;
%
% Данные модельных сигналов
fstart1 = 0.05;
fend1 = 0.1;
a1 = 1;
%
fstart2 = -0.1;
fend2 = -0.2;
a2 = 0.5;
%
fstart3 = -0.4;
fend3 = -0.3;
a3 = 1.5;
%
Wn = 0.1;              % Частота среза ФНЧ-прототипа
snr = 5;               % С/Ш
phi = 0;            
order = 2;             % Порядок фильтра
% Формируем модельный сигнал 
m = 1:N; 
x = a1*complex(chirp(m, fstart1/2, N, fend1/2, [], phi)...
          , chirp(m, fstart1/2, N, fend1/2, [], phi - 90)) + ...
    a2*complex(chirp(m, fstart2/2, N, fend2/2, [], phi)...
          , chirp(m, fstart2/2, N, fend2/2, [], phi - 90)) +...
    a3*complex(chirp(m, fstart3/2, N, fend3/2, [], phi)...
          , chirp(m, fstart3/2, N, fend3/2, [], phi - 90));
% Добавим шума
x = awgn(x, snr);

% Расчитаем комплексный полосовой фильтр
[z,p,k] = butter(order, Wn); % ФНЧ прототип
% Считаем коэффициенты фильтра
num = poly(z)  * k;              
den = poly(p);
den = den / max(den);
% Сдвиг НЧ прототипа в частотной области 
% Wn - частота среза исходного ФНЧ
% [fstart1,fend1] - полоса ПФ
[num1, den1] = iirlp2bpc(num, den, Wn, [fstart1,fend1]);
% Фильтруем сигнал получившимся ПФ
x1 = filter(num1, den1, x);
% Выводим результаты
figure('Name', 'СПМ');
% Выводим оценку СПМ Уэлча исходного сигнала
Pxx = fftshift(pwelch(x, nuttallwin(N), [], Nfft));
Pxx = Pxx .* conj(Pxx);
Pxx = 10*log10(Pxx ./ max(Pxx));
subplot(211);
plot(f_vec, Pxx);
grid on;
title('СПМ исходного сигнала');
ylabel('СПМ, дБ');
xlabel('Норм. частота')
ylim([-90,10]);
xlim([-1,1]);

% Выводим оценку СПМ Уэлча фильтрованного сигнала
Pxx = fftshift(pwelch(x1, nuttallwin(N), [], Nfft));
Pxx = Pxx .* conj(Pxx);
Pxx = 10*log10(Pxx ./ max(Pxx));
subplot(212);
plot(f_vec, Pxx);
ylim([-90,10]);
xlim([-1,1]);
title('СПМ фильтрованного сигнала');
ylabel('СПМ, дБ');
xlabel('Норм. частота');
grid on;

% Выводим осциллограммы исходного сигнала и фильтрованного сигнала
figure('Name', 'Осц');
subplot(411);
plot(real(x));
grid on;
title('Исходный сигнал (I)');
subplot(412);
plot(imag(x));
grid on;
title('Исходный сигнал (Q)');
subplot(413);
plot(real(x1));
grid on;
title('Фильтрованный сигнал (I)');
subplot(414);
plot(imag(x1));
grid on;
title('Фильтрованный сигнал (Q)');
В принципе так же можно просто нули z и полюсы p ФНЧ прототипа домножить на exp(1j*w), где w - центральная частота полосы и потом пересчитать num1 = poly(z) * k; den1 = poly(p); den1 = den1 / max(den);
Вложения
СПМ исходного комплексного сигнала и отфильтрованного в требуемой полосе
СПМ исходного комплексного сигнала и отфильтрованного в требуемой полосе
Осциллограммы исходного комплексного сигнала и отфильтрованного в требуемой полосе
Осциллограммы исходного комплексного сигнала и отфильтрованного в требуемой полосе

MikhailS
Сообщения: 3
Зарегистрирован: 02 апр 2015, 11:30

Re: Цифровая фильтрация комплексного сигнала

Сообщение MikhailS »

Илья писал(а):Вроде разобрался, как рассчитывать комплексные фильтры в Matlab)))
Илья, спасибо за ответ.
Уточню задачу. Заданы 5 комплексных коэффициента, фильтр КИХ. В матлабе все просто, как удар копытом по голове - y=filter(C,1,x), где С - вектор из пяти комплексных коэффициента (задаются рандомно, но симметрично, нулевой равен четвертому, первый равен третьему), x - комплексный сигнал, N отсчетов, y - сигнал на выходе.
Необходимо затолкать эту всю богадельню в верилог, прогнать тестбенч и полученный отклик y~ сравнить с матлабовским. Должны совпасть.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Цифровая фильтрация комплексного сигнала

Сообщение Бахурин Сергей »

Тогда надо перевести коэффициенты и исходный сигнал в фиксированную точку.
После провести фильтрацию этой же функцией фильтр и результат сатурировать и округлить в соответствии с положением точки.

MikhailS
Сообщения: 3
Зарегистрирован: 02 апр 2015, 11:30

Re: Цифровая фильтрация комплексного сигнала

Сообщение MikhailS »

Бахурин Сергей писал(а):Тогда надо перевести коэффициенты и исходный сигнал в фиксированную точку.
После провести фильтрацию этой же функцией фильтр и результат сатурировать и округлить в соответствии с положением точки.
Сергей, прошу прощения, но я не понял совсем. В какую фиксированную точку перевести коэффициенты и как из этого получить реализацию на верилог?

Ответить