В этом примере показано, как использовать комплексные многоскоростные фильтры в реализации Цифровых понижающих преобразователей (DDC). DDC является ключевым компонентом цифровых радио. Это выполняет перевод частоты, необходимый, чтобы преобразовать высокие входные частоты дискретизации, которые, как обычно находят при выходе аналого-цифрового конвертера (A/D) вниз, понизили частоты дискретизации для далее и более легкая обработка. В этом примере мы будем видеть, как звуковой сигнал, модулируемый с несущей частотой на 450 кГц, может быть понижен до частоты дискретизации на 20 кГц. После краткого обзора обычной архитектуры DDC мы опишем альтернативное решение, известное как подвыборку Промежуточной частоты (IF), и мы сравним соответствующую стоимость внедрения этих двух решений. Этот пример требует лицензии Fixed-Point Designer™.
Обычное вниз процесс преобразования запускается с выборки аналогового сигнала на уровне, который удовлетворяет критерию Найквиста несущей. Возможный вариант состоял бы в том, чтобы произвести входной сигнал на 450 кГц на уровне 2,0 МГц, затем с помощью цифрового вниз конвертер, чтобы выполнить комплексный перевод в основную полосу, фильтр и вниз выборку 25 с Каскадным интегрально-гребенчатым (CIC) фильтром, и затем проредить 4 с парой полуленточных фильтров. Такую реализацию показывают ниже:
Проект CIC-фильтра
Первым фильтром обычного DDC обычно является CIC-фильтр. CIC-фильтры эффективны, структуры множителя меньше, которые используются в системах высокой децимации или интерполяции. В нашем случае это понизит сигнал на 2 МГц до 2,0 МГц / 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
КИХ компенсации проект Decimator
Второй фильтр обычного DDC компенсирует свисание полосы пропускания, вызванное CIC. Поскольку CIC имеет подобный sinc ответ, он может быть компенсирован свисание с фильтром lowpass, который имеет обратный-sinc ответ в полосе пропускания.
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);
Поскольку несущая частота отбрасывается как часть экстракции сигнала, нет никакой потребности сохранить его во время процесса выборки данных. Критерий Найквиста несущей может на самом деле быть нарушен, пока критерию Найквиста полосы пропускания комплексного конверта удовлетворяют.
Эта узкополосная интерпретация критерия Найквиста приводит к альтернативному процессу сбора данных, известному как будто подвыборка. В этом процессе частота дискретизации конвертера A/D выбрана, чтобы быть меньше центральной частоты сигнала, чтобы намеренно исказить центральную частоту. Поскольку критерий Найквиста намеренно нарушается, аналоговый сигнал должен быть обусловлен, чтобы препятствовать тому, чтобы несколько интервалов частоты исказили к тому же местоположению частоты, как желаемый компонент сигнала исказит.
Переменная y представляет приблизительно 3 секунды звукового сигнала, модулируемого с несущей частотой на 450 кГц. Дискретный сигнал ys представляет выход конвертера A/D на 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 decimator, прототип к частоте дискретизации четверти путем умножения коэффициентов фильтра с гетеродином называет 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')
Мы теперь применяем комплексную полосу пропускания decimator к выходу конвертера 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 "искажения". (Copyright 2002 FingerBomb)
player = audioDeviceWriter('SampleRate',dhbfilter.Fs_out);
player(real(yf));
Прежде чем мы перейдем к анализу затрат, давайте проверим, что ответы величины фильтров в двух решениях для DDC сопоставимы. Мы исключаем и комплексный перевод в основную полосу в обычном случае DDC и гетеродин в случае подвыборки IF. Кроме того, мы используем прототип lowpass decimator в последнем случае, поскольку это имеет ту же ширину перехода, неравномерности в полосе пропускания и затухание в полосе задерживания как комплексная полоса пропускания decimator.
altDDCFilter = cascade(lpfilter,hbfilter);
Мы проверяем, что фильтры, используемые в обоих случаях, имеют очень похожие ответы величины: неравномерность в полосе пропускания на меньше чем 0,04 дБ, частота среза на 6 дБ 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'
Количество множителей, сумматоров и состояний, требуемых в случае подвыборки IF, сопоставимо с тем из обычного DDC, но количество операций в секунду значительно сокращено, поскольку это сохраняет 71% количества умножения в секунду и 85% количества сложений в секунду.
Мы можем спроектировать комплексный полосовой фильтр более легко при помощи 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, основанного на подвыборке цифровой вниз конвертеры. Метод подвыборки IF может быть экономически эффективной альтернативой обычному DDCs во многих приложениях. Для получения дополнительной информации о IF подвыборка смотрите Многоскоростную Обработку сигналов для Систем связи fredric j harris, Prentice Hall, 2004.