Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Интерполяция CIC фильтром
Форум разработчиков электроники ELECTRONIX.ru > Цифровая обработка сигналов - ЦОС (DSP) > Алгоритмы ЦОС (DSP)
Olga_woroncova
Здравствуйте! Подскажите пожалуйста, делаю интерполяцию с помощью CIC фильтра, вроде бы всё по теории, но у получившегося сигнала амплитуда меньше, чем должна быть. Почему так получается? правильно ли я выбираю коэффициент для нормирования амплитуды?
Код
close all; clc; clear;

% Формирование сигнала.
Fs = 1000;
T = 1/Fs;
L = 50;
t = (0:L-1)*T;

x = 5*sin(2*pi*50*t);

% Коэффициент интерполяции
R = 5;
T1 = 1/(R*Fs);
t1 = (0:R*L-1)*T1;

% Величина задержки
D = 2*R;

% Порядок фильтра
N = 4;

% Усиление
Klg = 20*N*log10(D);
K = D^N;

% Расчет коэффициентов передаточной функции
% H(w) = (1 - z^(-D))^N / (1 - z^-1)^N
b = 1;
a = 1;
for n = 1 : N
    b = conv(b, [1 zeros(1,D-1) -1]);
    a = conv(a, [1 -1]);
end

% АЧХ и ФЧХ полученного фильтра стандартными средствами матлаб.
figure;
freqz(b,a);

% Применяем фильтр к сигналу стандартными средствами матлаб
nx = zeros(1,R*L);
nx(1:R:R*L) = x;
y = filter(b,a,nx);
y = (y/K)*R;

% И смотрим результат
figure;
plot(t,x,'-o',t1,y, '-o')

xlabel('Время, с')
ylabel('Амлитуда сигнала, у.е.')
legend({'сигнал', 'filter()'})
ViKo
А задержка вас не смущает? По-моему, оба эти свойства есть следствие того, что фильтр слишком низкочастотный.
coding4dsp
Добрый день!

Во-первых, судя по АЧХ синус попадает на наклон, где сигнал претерпевает ослабление.
Во-вторых, ваш фильтр не стабилен! Посмотрите на сигнал, при L = 50000;

На CIC не очень похоже - CIC это FIR фильтр, а у вас IIR.
litv
Рекомендую почитать http://www.dsplib.ru/content/cic/cic.html
quato_a
Цитата(coding4dsp @ Nov 28 2017, 11:59) *
На CIC не очень похоже - CIC это FIR фильтр, а у вас IIR.


CIC - это FIR (КИХ) ?
thermit
Цитата(quato_a @ Nov 28 2017, 15:26) *
CIC - это FIR (КИХ) ?



Ибоваистену.
cic1 - реализации однородного ких через бих. На форуме куча информации про этосамое.
Kluwert
Цитата(quato_a @ Nov 28 2017, 15:26) *
CIC - это FIR (КИХ) ?

По-сути, CIC (фильтр Хогенауэра) - это совершенно тупой (нерекурсивный изначально) фильтр скользящего среднего. Заслуга Хогенауэра (можно легко найти его статью в Инете), что, используя формулы бинома Ньютона, он представил его в виде рекурсивного фильтра. Мало того, при конечной разрядности, он использует сумматоры с циклическим перполнением, у которых ещё и переменная разрядность как функция номера секции. Во времена, когда ещё даже не сущестовало даже БМК (и, тем более, ПЛИС) - это было великим делом.

Но у CIC-фильтров есть один существенный недостаток: легко прикинуть, что, т.к. он равноценен некому фильтру СС, то его АЧХ будет типа sinc(f), что приводит к дикой неравномерности АЧХ в полосе пропускания. Как правило этот фильтр используется в квадратурных приёмниках и если допустимо, что бы частота оцифровки квадратур была заметно больше полуширины полосы сигнала, то - можно с этим жить. Но, как правило, это не позволительная роскошь. А тогда, на выходе этого фильтра приходится примастрячивать компенсирующей фильтр весьма нехилой длины. Да, он уже работает на пониженной частоте. Но по аппаратурной сложности все плюсы CIC-фильтра сходят на нет. Кроме того, CIC страдает просто фантастическом ростом выходной разрядности, поледующее грамотное упихивание оной в заданную - это не такая тривиальная задача, как кажется.

Поэтому, у нас в конторе, например, уже давно от CIC-фильтров отказались - в квадратурных приёмниках производится 2-3-ступенчатое понижение частоты на обычных нерекурсивных фильтрах невысокого порядка. Для современнных мощных и скоростных ПЛИС - это гораздо более экономичное и практичное решение (во всех смыслах).
coding4dsp
Kluwert, а какие у вас коэффициенты интерполяции/децимации?
Kluwert
Цитата(coding4dsp @ Dec 11 2017, 10:37) *
Kluwert, а какие у вас коэффициенты интерполяции/децимации?

Весьма разные. В связных задачах и до сотни доходило, потому что там в какой-нибудь системе связи на КВ/УКВ выходная полоса измеряется единицами килогерц, а на входе - десятки мегагерц. Сначала - "гетеродинирование на АЦП" (когда АЦП работает на частоте в несколько раз ниже частоты сигнала, обобщённая т. Котельникова) давала 3-4-кратный сброс частоты оцифровки, ну а затем - в цифре. В радиолокационных задачах - меньше, там полосы обычно гораздо шире.
Мало того, было даже как-то "соревнование", когда в 4 руки делали квадратурный приёмник на разных плисовских платформах. Я - на базе обычных фильтров, "соперник" - на CIC. Я сделал раза в 2 быстрее sm.gif
Кстати, по поводу CIC я допустил небольшую неточность: если вы решаете радиолокационную/гидроакустическую задачу и фильтры в квадратурных каналах у вас - это фильтры сжатия или согласованные фильтры, ну, или, дальше у вас стоит коррелятор (кому что нравиться), то компенсирующий фильтр на выходе можно вообще не ставить: вы просто можете учесть завалы в АЧХ CIC'а в АЧХ фильтров, или в опорном сигнале в коррелятора. Правда, здесь могут начаться тонкие игры с разрядностью: ибо разрешение как раз определяется в основном ВЧ-частью спектра, а эта часть как раз и будет давиться и проваливаться в младшие разряды. Так что ... вот.
coding4dsp
Интересно! Я полагал, что аппаратная реализация CIC'ов лаконична и прозрачна по сложности. Собственно, как и в software.

А что с использованием ресурсов ПЛИС? Как работать с ПЛИС я не знаю, но слышал о кол-ве использованных лутов, брамов, DSP и пр.
А что с качеством? Подавление вне полезной полосы и пульсации в полосе пропускания одинаковы у обоих методов?
Не критикуя Вас и ваших коллег, Вы уверены, что одинаково хорошо работали над своими реализациями?




quato_a
Цитата(Kluwert @ Dec 11 2017, 11:51) *
Мало того, было даже как-то "соревнование", когда в 4 руки делали квадратурный приёмник на разных плисовских платформах. Я - на базе обычных фильтров, "соперник" - на CIC. Я сделал раза в 2 быстрее sm.gif


Соревнование без корок? sm.gif
Olga_woroncova
Спасибо за ответы! Я так поняла, что амплитуда идеально не совпадет, если использовать только CIC фильтр. Для улучшения результата в литературе рекомендуют перед CIC фильтром поставить фильтр-корректор(АЧХ на рисунке). Но данный фильтр имеет высокий порядок для обеспечения необходимой характеристики (пример из статьи). Целесообразно ли вообще его применять? Если да, то подскажите как можно уменьшить его порядок.
quato_a
Цитата(Olga_woroncova @ Dec 22 2017, 08:24) *
Целесообразно ли вообще его применять?

У себя в проекте отказался от CIC интерполяции в R раз при формировании OFDM-сигнала как раз-таки из-за большого порядка фильтра-корректора. Использую интерполяцию через БПФ.
Может вместо борьбы с сокращением порядка фильтра-корректора воспользоваться добавлением нулей к сигналу и FIR на полосу сигнала? Думаю, ресурсов потребует меньше.
Lmx2315
(написал ерунду потому что невнимательно прочитал начало темы, перепутал интерполятор с дециматором)
thermit
Цитата(quato_a @ Dec 22 2017, 11:12) *
У себя в проекте отказался от CIC интерполяции в R раз при формировании OFDM-сигнала как раз-таки из-за большого порядка фильтра-корректора. Использую интерполяцию через БПФ.
Может вместо борьбы с сокращением порядка фильтра-корректора воспользоваться добавлением нулей к сигналу и FIR на полосу сигнала? Думаю, ресурсом потребует меньше.


Что мешало скорректировать искажения цика на этапе формирования поднесущих?


quato_a
Цитата(thermit @ Dec 22 2017, 15:14) *
Что мешало скорректировать искажения цика на этапе формирования поднесущих?


Повышение разрядности созвездий перед IFFT.
Olga_woroncova
Есть ещё вопрос по поводу ФЧХ CIC фильтра. В теории она имеет пилообразный вид, а я получаю линейную с разрывами, с чем это связано?
quato_a
Цитата(Olga_woroncova @ Dec 29 2017, 05:39) *
Есть ещё вопрос по поводу ФЧХ CIC фильтра. В теории она имеет пилообразный вид, а я получаю линейную с разрывами, с чем это связано?

Пилообразная и линейная - одно и тоже. Фаза же циклична ph = 2pi + ph.
А у Вас и АЧХ с разрывами (значения не определены), может быть там где-нибудь деление на нуль (NaN), посмотрите в workspace.
Kluwert
Цитата(quato_a @ Jan 2 2018, 13:15) *
Пилообразная и линейная - одно и тоже. Фаза же циклична ph = 2pi + ph.
А у Вас и АЧХ с разрывами (значения не определены), может быть там где-нибудь деление на нуль (NaN), посмотрите в workspace.

Точнее, коль скоро график в Дб, там у неё нулевые значения sm.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.