Поддискретизация IF с комплексными многоскоростными фильтрами

В этом примере показано, как использовать комплексные многоскоростные фильтры в реализации цифровых преобразователей частоты (DDC). DDC является ключевым компонентом цифровых радиостанций. Он выполняет преобразование частоты, необходимое для преобразования высоких входных частот выборки, обычно обнаруженных на выходе аналого-цифрового (A/D) преобразователя, вниз к более низким скоростям дискретизации для дальнейшей и легкой обработки. В этом примере мы увидим, как аудиосигнал, модулированный несущей частотой 450 кГц, может быть понижен до частоты дискретизации 20 кГц. После краткого обзора традиционной архитектуры DDC, мы опишем альтернативное решение, известное как субдискретизация средней частоты (IF), и сравним соответствующие затраты на реализацию этих двух решений. Для этого примера требуется лицензия Fixed-Point Designer™.

Обычный цифровой преобразователь вниз

Обычный процесс преобразования с понижением частоты начинается с дискретизации аналогового сигнала со скоростью, которая удовлетворяет критерию Найквиста для несущей. Возможной опцией является дискретизация входного сигнала 450 кГц на частоте 2.0 МГц, затем использование цифрового преобразователя частоты для выполнения комплексного преобразования в полосу частот, фильтрация и понижение выборки на 25 с помощью фильтра Cascaded Integrator-Comb (CIC), а затем понижение частоты на 4 с парой получастотных фильтров. Такая реализация показана ниже:

Проект CIC-фильтра

Первый фильтр обычного DDC обычно является CIC-фильтром. CIC-фильтры являются эффективными структурами без умножения, которые используются в системах высокой децимации или интерполяции. В нашем случае он снизит частоту сигнала 2 МГц до 2,0 MHz/25 = 80 кГц.

Fs_normDDC = 2e6;          % Sampling frequency
R          = 25;           % Decimation factor
Fpass      = 10e3;         % Passband Frequency
Astop      = 60;           % Aliasing Attenuation(dB)
D          = 1;            % Differential delay
dcic = fdesign.decimator(R,'cic',D,Fpass,Astop,Fs_normDDC);
cic = design(dcic,'SystemObject',true);
cicgain = dsp.FIRFilter('Numerator',1/gain(cic)); % Normalize gain of CIC

Компенсация конечной импульсной характеристики дециматор Проекта

Второй фильтр обычного DDC компенсирует падение полосы пропускания, вызванное CIC. Поскольку CIC имеет синус-подобный ответ, он может быть компенсирован для падения с помощью lowpass фильтра, который имеет обратный синус-ответ в полосе пропускания.

Nsecs = cic.NumSections;       % Number of sections
Fpass  = 10e3;                 % Passband Frequency
Fstop  = 25e3;                 % Stopband Frequency
Apass  = 0.01;                 % Passband Ripple (dB)
Astop  = 80;                   % Stopband Attenuation (dB)
dcp = fdesign.decimator(2,'ciccomp', ...
    D,Nsecs,Fpass,Fstop,Apass,Astop,dcic.Fs_out);
cfir = design(dcp,'equiripple', ...
    'StopBandShape','linear','StopBandDecay',60,'SystemObject',true);

Полуполоса Создания фильтра

Мы наконец используем полуполосный фильтр 20-го порядка, чтобы снизить частоту сигнала 40 кГц до 20 кГц.

dhbfilter = fdesign.decimator(2,'halfband','N',20,dcp.Fs_out);
hbfilter = design(dhbfilter,'SystemObject',true);

Обычный фильтр DDC получают путем расположения каскадом трех ранее спроектированных стадий.

normDDCFilter = cascade(cicgain,cic,cfir,hbfilter);

Поддискретизация IF

Поскольку несущая частота отбрасывается как часть извлечения сигнала, нет необходимости сохранять ее в процессе дискретизации данных. Критерий Nyquist для несущей может быть фактически нарушен, пока удовлетворен критерий Nyquist для полосы пропускания сложной огибающей.

Эта узкополосная интерпретация критерия Найквиста приводит к альтернативному процессу набора данных, известному как поддискретизация IF. В этом процессе частота дискретизации A/D преобразователя выбирается меньшей, чем центральная частота сигнала, чтобы преднамеренно сглаживать центральную частоту. Поскольку критерий Найквиста преднамеренно нарушается, аналоговый сигнал должен быть обусловлен, чтобы предотвратить сглаживание нескольких частотных интервалов в том же частотном местоположении, что и требуемый компонент сигнала.

Переменная y представляет приблизительно 3 с аудиосигнала, модулированного несущей частотой 450 кГц. Дискретный сигнал ys представляет выход аналого-цифрового преобразователя с частотой 120 кГц.

[y,ys,Fs] = loadadcio;
Fs_altDDC = 1.2e5;   % Sampling frequency

[Hys,Fys] = periodogram(ys,[],[],Fs,'power','centered');
N = length(Fys);

figure('color','white')
periodogram(y,[],[],Fs,'power','centered');
clear y;
hold on;
plot((-(ceil(N/2*9)-1):floor(N/2*9))/N*Fs_altDDC/1000, ...
        repmat(10*log10(Hys),9,1),'r:');
axis([-50 500 -160 0])
legend('Input of A/D Converter','Aliased Output of A/D Converter', ...
    'Location','NorthEast');

Частотная полоса около 450 кГц сглаживалась около -30 кГц. Сглаживание до четверти частоты дискретизации максимизирует разделение между положительным и отрицательным псевдонимами частот. Это позволяет максимальную переходную полосу для аналогового полосно-пропускающего фильтра и, следовательно, минимизирует его стоимость.

Выбор частоты дискретизации 120 кГц также облегчает последующую задачу преобразования вниз на 20 кГц, которая достигается путем понижающей дискретизации в 6 раз. Преобразование вниз может быть достигнуто в два этапа. Сначала понижающую дискретизацию 3 к 1 выполняют комплексным полосно-пропускающим фильтром с последующим преобразованием 2 к 1 с полуполосой фильтром. Структура этого сглаживающего DDC показана ниже.

Комплексная полосно-пропускающее Создание фильтра

Чтобы получить комплексный полосно-пропускающий фильтр, мы переводим прототип дециматора lowpass к четверти частоты выборки путем умножения коэффициентов фильтра с гетеродинными терминами exp (-j * pi/2 * n). Заметьте, что хотя коэффициенты lowpass являются вещественными, коэффициенты переведенного фильтра являются комплексными. Рисунок ниже изображает величину характеристики этих фильтров.

M = 3;               % Decimation Factor
TW   = Fstop-Fpass;  % Transition Width (Hz)
designLowpass = fdesign.decimator(M,'nyquist',M,TW,Astop,Fs_altDDC);
lpfilter = design(designLowpass,'SystemObject',true); % Lowpass prototype
n = 0:length(lpfilter.Numerator)-1;
complexBPFilter = dsp.FIRDecimator(M,lpfilter.Numerator.*exp(-1i*pi/2*n));
fvt = fvtool(lpfilter,complexBPFilter,'Fs',Fs_altDDC,'Color','White');
legend(fvt,'Lowpass Decimator','Complex Bandpass Decimator', ...
    'Location','NorthEast')

Теперь мы применяем комплексный полосный дециматор к выходу A/D конвертера. Можно показать, что сигнал с четвертью частотой дискретизации всегда будет псевдонимом кратному четверти частоты дискретизации при десятикратном уменьшении любым целочисленным коэффициентом. В нашем примере центрированный сигнал -30 кГц будет псевдонимом 40/4 = 10 кГц.

ycbp = complexBPFilter(ys);
figure('color','white')
periodogram(ycbp,[],[],designLowpass.Fs_out,'power','centered');
legend('Output of Complex Bandpass Decimator')

Последовательность выхода ycbp затем гетеродинируется, чтобы нуль.

yht = ycbp.*(-1i).^(0:length(ycbp)-1).';
figure('color','white')
periodogram(yht,[],[],designLowpass.Fs_out,'power','centered');
legend('Heterodyned Sequence')

Наконец, гетеродинизированная последовательность передается как вход в полуполосный фильтр и децимируется на 2. Мы можем повторно использовать тот же полуполосный фильтр, что и в обычном DDC.

yf = hbfilter(yht);
figure('color','white')
periodogram(yf,[],[],dhbfilter.Fs_out,'power','centered');
legend('Output of Aliasing DDC')

Воспроизведение аудиосигнала на выходе DDC «сглаживания». (Копирайт 2002 FingerBomb)

player = audioDeviceWriter('SampleRate',dhbfilter.Fs_out);
player(real(yf));

Сравнение затрат на реализацию

Прежде чем мы перейдем к анализу затрат, давайте проверим, что величины ответы фильтров в двух решениях DDC сопоставимы. Мы исключаем как комплексный преобразование в полосу базовых частот в обычном случае DDC, так и гетеродин в случае поддискретизации IF. Кроме того, мы используем дециматор прототипа lowpass в последнем случае, поскольку он имеет ту же ширину перехода, неравномерности в полосе пропускания и затухание в полосе задерживания, что и комплексный дециматор полосы пропускания.

altDDCFilter = cascade(lpfilter,hbfilter);

Мы проверяем, что фильтры, используемые в обоих случаях, имеют очень сходные величины характеристики: менее 0,04 дБ неравномерности в полосе пропускания, 6dB частота отключения 10 кГц и 55 дБ затухания в полосе задерживания на 13,4 кГц. Поэтому справедливо перейти к анализу затрат.

set(fvt, ...
    'Filters',{normDDCFilter,altDDCFilter}, ...
    'FrequencyRange','Specify freq. vector', ...
    'FrequencyVector',linspace(0,100e3,2048), ...
    'Fs',[Fs_normDDC,Fs_altDDC], ...
    'ShowReference','off', ...
    'Color','White');
legend(fvt,'Conventional DDC Filter', ...
    'Equivalent Digital IF Subsampling Filter', ...
    'Location','NorthEast');

В случае обычного DDC мы должны сначала принять во внимание стоимость перевода основной полосы частот. Мы предполагаем, что это сделано только с одним умножителем, работающим на 2 МГц. Затем необходимо добавить стоимость CIC и полуполосных фильтров. В случае поддискретизации IF мы должны рассмотреть стоимость гетеродина. Мы предполагаем, что это сделано только с одним множителем, работающим на 40 кГц. Затем необходимо добавить стоимость сложных полосно-пропускающих и полуполосных фильтров.

% Cost of CIC and halfband filters
c_normDDC = cost(normDDCFilter);
% Cost of complex bandpass and halfband filters
c_altDDC  = cost(cascade(complexBPFilter,hbfilter));
ddccostcomp(Fs_normDDC,c_normDDC,Fs_altDDC,c_altDDC)
ans =

    'Total Cost                      : Conventional DDC | IF subsampling
     -------------------------------------------------------------------
     Number of Coefficients          :               36 |             42
     Number of States                :               50 |             62
     Multiplications per microsecond :             5.18 |            1.5
     Additions per microsecond       :             9.44 |            1.4'

Количество умножителей, сумматоров и состояний, требуемых в случае поддискретизации ПЧ, сопоставимо с количеством операций в секунду обычного РДЦ, но количество операций в секунду значительно уменьшается, поскольку это экономит 71% от количества умножений в секунду и 85% от количества сложений в секунду.

Использование dsp. ComplexBandpassDecimator

Мы можем спроектировать сложный полосно-пропускной фильтр легче при помощи dsp. Системный объект ComplexBandpassDecimator. Объект проектирует полосно-пропускающий фильтр на основе заданного коэффициента десятикратного уменьшения, центральной частоты и частоты дискретизации. Нет необходимости переводить коэффициенты lowpass на полосу пропускания, как мы сделали в проекте выше: объект сделает это за нас. Более того, объект выведет частоту, которой сглаживается фильтрованный сигнал, и смешает его обратно к нулю Гц для нас.

% Design a complex bandpass filter. Include the decimate-by-2 halfband
% filter into the design by specifying a decimation factor of 2*M:
bp = dsp.ComplexBandpassDecimator(M*2 , -30e3, Fs_altDDC,...
                                  'TransitionWidth',TW);
% Visualize the filter response
visualizeFilterStages(bp);
% Filter the output of the 120 kHz A/D converter
yf = bp(ys);
figure('color','white')
periodogram(yf,[],[],dhbfilter.Fs_out,'power','centered');
legend('Output of complex bandpass decimator')
player(real(yf));

Сводные данные

Этот пример показал, как комплексные многоскоростные фильтры могут использоваться при разработке цифровых понижающих преобразователей на основе IF-дискретизации. Метод частотной дискретизации может быть экономически эффективной альтернативой обычным DDC во многих приложениях. Для получения дополнительной информации о поддискретизации IF смотрите Multirate Signal Processing for Communication Systems by fredric j harris, Prentice Hall, 2004.