Этот пример показывает, как использовать комплексные многоскоростные фильтры в реализации Цифровых понижающих преобразователей (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.