Проект Decimators и Interpolators

В этом примере показано, как спроектировать фильтры для децимации и интерполяции дискретных рядов.

Роль Lowpass, просачивающегося преобразование уровня

Преобразование уровня является процессом изменения уровня дискретного сигнала получить новое дискретное представление базового непрерывного сигнала. Процесс включает универсальную субдискретизацию и повышающую дискретизацию. Универсальная субдискретизация уровнем N относится к взятию каждой Энной выборки последовательности и отбрасывания остальной части выборок. Универсальная повышающая дискретизация на коэффициент N относится к дополнению N-1 нулей между каждыми двумя последовательными выборками.

x = 1:3
L = 3; % upsampling rate
M = 2; % downsampling rate

% Upsample and downsample
xUp = upsample(x,L)
xDown = downsample(x,M)
x =

     1     2     3


xUp =

     1     0     0     2     0     0     3     0     0


xDown =

     1     3

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

  • При субдискретизации уровнем$N$, фильтр lowpass, примененный до субдискретизации пределов входная полоса пропускания и таким образом устранение искажения спектра. Это похоже на аналоговый LPF, используемый в конвертерах A/D. Идеально, такой фильтр сглаживания имеет модульное усиление и частоту среза$\omega_c = \frac{1}{N}\omega_N$, вот$\omega_N$ частота Найквиста сигнала. Примечание: базовая частота дискретизации незначительна, мы принимаем нормированные частоты (i.e)$\omega_N=1$. в течение обсуждения.

  • При повышающей дискретизации уровнем $N$фильтр lowpass, примененный после того, как, повышающая дискретизация известна как реконструкционный фильтр. Фильтр удаляет спектральные изображения сигнала с низкой ставкой. Идеально, частота среза этого реконструкционного фильтра$\omega_c = \frac{1}{N}$ (как его дубликат сглаживания), в то время как его усиление$N$.

И повышающая дискретизация и субдискретизация операций уровня$N$ требуют фильтра lowpass с нормированной частотой среза$\frac{1}{N}$. Единственная разница находится в необходимом усилении и размещении фильтра (перед или после преобразования уровня).

Комбинация повышающей дискретизации сигнала на коэффициент$L$, сопровождаемый путем фильтрации, и затем субдискретизации на коэффициент$M$ преобразований частоты дискретизации последовательности рациональным фактором$\frac{L}{M}$. Это получено путем повышающей дискретизации уровнем$L$, сопровождаемым путем фильтрации, затем субдискретизации уровнем$M$. Порядок операции преобразования уровня не может коммутироваться. Один фильтр, который комбинирует сглаживание и антиобработку изображений, помещается между повышающей дискретизацией и этапами субдискретизации. Этим фильтром является lowpass с нормированной частотой среза$\omega_c=\min(1/L,1/M)$ и усилением$L$.

В то время как любая КИХ-функция проекта lowpass (например, fir1, firpm, или fdesign) мог спроектировать соответствующее сглаживание и реконструкционный фильтр, функциональный designMultirateFIR дает удобное и упрощенный интерфейс. Следующие несколько разделов показывают использование этих функций, чтобы спроектировать фильтр и продемонстрировать почему designMultirateFIR предпочтительный путь.

Фильтрованное преобразование уровня: Decimators, интерполяторы и рациональные конвертеры уровня

Фильтрованные преобразования уровня включают decimators, интерполяторы и рациональные конвертеры уровня, все из которых являются каскадами блоков изменения уровня с, просачиваются различные настройки.

Фильтрованное Преобразование Уровня с помощью filter, upsample, и downsample функции

Децимация относится к фильтрации LTI, сопровождаемой универсальной субдискретизацией. КИХ decimator может быть реализован можно следующим образом.

  1. Проект a сглаживающийся фильтр lowpass h

  2. Отфильтруйте вход хотя h

  3. Downsample отфильтрованная последовательность на коэффициент M

% Define an input sequence
x = rand(60,1);

% Implement an FIR decimator
h = fir1(L*12*2,1/M); % an arbitrary filter
xDecim = downsample(filter(h,1,x), M);

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

xInterp = filter(h,1,upsample(x,L));

Наконец, рациональное преобразование уровня состоит из интерполятора, сопровождаемого decimator (в том определенном порядке).

xRC = downsample(filter(h,1,upsample(x,L) ), M);

Фильтрованное преобразование уровня Используя системные объекты

Для потоковой передачи данных, системные объекты dsp.FIRInterpolator, dsp.FIRDecimator, и dsp.FIRRateConverter инкапсулируйте изменение уровня и просачивание отдельного объекта. Например, конструкция интерполятора сделана можно следующим образом.

firInterp = dsp.FIRInterpolator(L,h);

Затем накормите последовательностью недавно созданный объект вызовом шага.

xInterp = firInterp(x);

Спроектируйте и используйте decimators и конвертеры уровня похожим способом.

firDecim = dsp.FIRDecimator(M,h); % Construct
xDecim = firDecim(x); % Decimate (step call)

firRC = dsp.FIRRateConverter(L,M,h); % Construct
xRC = firRC(x); % Convert rate (step call)

Используя системные объекты обычно предпочитается, как они:

  • Допускайте более чистый синтаксис.

  • Сохраните состояние как начальная буква фильтра coniditon для последующих вызовов шага.

  • Самое главное они используют очень эффективный многофазный алгоритм.

Чтобы создать они возражают, вам нужны коэффициент преобразования уровня и КИХ-коэффициенты. Следующий раздел описывает, как сгенерировать соответствующие КИХ-коэффициенты для фильтра преобразования уровня.

Спроектируйте Фильтр Преобразования Уровня с помощью designMultirateFIR

Функциональный designMultirateFIR(L,M) автоматически находит соответствующее масштабирование и частоту среза для данного отношения преобразования уровня$L/M$. Используйте КИХ-коэффициенты, возвращенные designMultirateFIR с dsp.FIRDecimator $L=1$(если), dsp.FIRInterpolator $M=1$(если), или dsp.FIRRateConverter (общий случай).

Давайте спроектируем фильтр интерполяции:

L = 3;
bInterp = designMultirateFIR(L,1); % Pure upsampling filter
firInterp = dsp.FIRInterpolator(L,bInterp);

Затем примените интерполятор к последовательности.

% Create a sequence
n = (0:89)';
f = @(t) cos(0.1*2*pi*t).*exp(-0.01*(t-25).^2)+0.2;
x = f(n);

% Apply interpolator
xUp = firInterp(x);
release(firInterp);

Давайте сначала исследуем необработанный выход интерполятора и соответствовать исходной последовательности.

plot_raw_sequences(x,xUp);

В то время как существует некоторое подобие между входом x и выход xUp, существует несколько основных отличий. В интерполированном сигнале

  • Временной интервал расширяется (как ожидалось).

  • Сигнал имеет задержку половины длины КИХ length(h)/2 (обозначенный$i_0$ впредь).

  • Вначале существует переходный процесс.

Чтобы выдержать сравнение, выровняйте и масштабируйте области времени этих двух последовательностей. Интерполированный демонстрационный xUp[k] соответствует входному времени$t[k]=\frac{1}{L}(k-i_0)$.

nUp = (0:length(xUp)-1);
i0 = length(bInterp)/2;
plot_scaled_sequences(n,x,(1/L)*(nUp-i0),xUp,["Original Sequence",...
            "Interpolator Output Sequence (Time Adjusted)"],[0,60]);

Та же идея работает на субдискретизацию, где преобразование времени$t[k] = Mk-i_0$:

M = 3;
bDecim = designMultirateFIR(1,M); % Pure downsampling filter
firDecim = dsp.FIRDecimator(M,bDecim);
xDown = firDecim(x);

Постройте их по той же шкале и настройте для задержки. Обратите внимание, что они перекрываются отлично.

i0 = length(bDecim)/2;
nDown = (0:length(xDown)-1);
plot_scaled_sequences(n,x,M*nDown-i0,xDown,["Original Sequence",...
            "Decimator Output Sequence (Time Adjusted)"],[-10,80]);

Визуализируйте ответы величины повышающей дискретизации и фильтров downampling с помощью fvtool. Два КИХ-фильтра идентичны в этом случае до различного усиления.

hfv = fvtool(firInterp,firDecim); % Notice the gains in the passband
legend(hfv,"Interpolation Filter L="+num2str(L), ...
            "Decimation Filter M="+num2str(M));

Общие рациональные преобразования могут быть обработаны тот же путь как повышающая дискретизация и субдискретизация. Сокращение$~\omega_c=\min(\frac{1}{L},~\frac{1}{M})~$, и усиление$L$. Функциональный designMultirateFIR понимает это автоматически.

L = 5;
M = 2;
b = designMultirateFIR(L,M);
firRC = dsp.FIRRateConverter(L,M,b);

Давайте теперь сравним объединенный фильтр с отдельными компонентами интерполяции/децимации.

firDecim = dsp.FIRDecimator(M,designMultirateFIR(1,M));
firInterp = dsp.FIRInterpolator(L,designMultirateFIR(L,1));

hfv = fvtool(firInterp,firDecim, firRC); % Notice the gains in the passband
legend(hfv,"Interpolation Filter L="+num2str(L),...
    "Decimation Filter M="+num2str(M), ...
    "Rate Conversion Filter L/M="+num2str(L)+"/"+num2str(M));

Однажды FIRRateConverter настраивается, выполните преобразование уровня вызовом шага.

xRC = firRC(x);

Постройте вход и фильтр выход с временной регулировкой, данной$t[k] = \frac{1}{L}(Mk-i_0)$.

nRC = (0:length(xRC)-1)';
i0 = length(b)/2;
plot_scaled_sequences(n,x,(1/L)*(M*nRC-i0),xRC,["Original Sequence",...
        "Rate Converter Output Sequence (time adjusted)"],[0,80]);

Корректировка КИХ-расчетных параметров Lowpass

Используя designMultirateFIR можно также настроить КИХ-длину, ширину перехода и затухание в полосе задерживания.

Корректировка КИХ-длины

КИХ-длиной можно управлять через L, M, и третий параметр P названный полумногофазной длиной, значение по умолчанию которой равняется 12 (обратитесь к Выходным аргументам для получения дополнительной информации). Давайте исследуем две точки проекта.

% Unspecified half-length defaults to 12
b24 = designMultirateFIR(3,1);

halfPhaseLength = 20;
b40 = designMultirateFIR(3,1,halfPhaseLength);

Обычно большая половина многофазной длины дает к более крутым переходам.

hfv = fvtool(b24,1,b40,1);
legend(hfv, 'Polyphase length = 24 (Default)','Polyphase length = 40');

Корректировка ширины перехода

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

TW = 0.02;
bTW = designMultirateFIR(3,1,TW);

hfv = fvtool(b24,1,bTW,1);
legend(hfv, 'Default Design (FIR Length = 72)',"Design with TW="...
        +num2str(TW)+" (FIR Length="+num2str(length(bTW))+")");

Особый случай преобразования уровня 2: полуполоса Interpolators и Decimators

Используя полуленточный фильтр (т.е.)$\omega_c=\frac{1}{2}$., можно выполнить преобразование частоты дискретизации на коэффициент 2. dsp.FIRHalfbandInterpolator и dsp.FIRHalfbandDecimator объекты выполняют интерполяцию и децимацию на коэффициент 2 полуленточных фильтров использования. Они системный объект реализованы с помощью эффективной многофазной структуры, специфичной для того преобразования уровня. БИХ-дубликаты dsp.IIRHalfbandInterpolator и dsp.IIRHalfbandDecimator может быть четным более эффективный. Эти системные объекты могут также работать с пользовательскими частотами дискретизации.

Визуализируйте ответ величины с помощью fvtool. В случае интерполяции фильтр сохраняет большую часть спектра от 0 до Фс/2 при ослаблении спектральных изображений. Для децимации фильтр передает приблизительно половину полосы, которая является 0 к Фс/4 и ослабляет другую половину для того, чтобы минимизировать искажение. Объем затухания может быть установлен в любое требуемое значение и для интерполяции и для децимации. Если незаданный, это принимает значение по умолчанию к 80 дБ.

Fs = 1e6;
hbInterp = dsp.FIRHalfbandInterpolator('TransitionWidth',Fs/10,...
    'SampleRate',Fs);
fvtool(hbInterp) % Notice gain of 2 (6 dB) in the passband
hbDecim  = dsp.FIRHalfbandDecimator('TransitionWidth',Fs/10,...
    'SampleRate',Fs);
fvtool(hbDecim)

Проект Equiripple

Функциональный designMultirateFIR использует проект оконный КИХ lowpass. Другие методы разработки lowpass могут быть применены также, такие как equiripple. Для большего количества управления процессом проектирования используйте fdesign функции создания фильтра. Следующий пример проектирует decimator использование fdesign.decimator функция.

M   = 4;   % Decimation factor
Fp  = 80;  % Passband-edge frequency
Fst = 100; % Stopband-edge frequency
Ap  = 0.1; % Passband peak-to-peak ripple
Ast = 80;  % Minimum stopband attenuation
Fs  = 800; % Sampling frequency
fdDecim = fdesign.decimator(M,'lowpass',Fp,Fst,Ap,Ast,Fs) %#ok
fdDecim = 

  decimator with properties:

          MultirateType: 'Decimator'
               Response: 'Lowpass'
       DecimationFactor: 4
          Specification: 'Fp,Fst,Ap,Ast'
            Description: {4x1 cell}
    NormalizedFrequency: 0
                     Fs: 800
                  Fs_in: 800
                 Fs_out: 200
                  Fpass: 80
                  Fstop: 100
                  Apass: 0.1000
                  Astop: 80

Технические требования для фильтра решают, что полоса перехода 20 Гц приемлема между 80 и 100 Гц и что минимальное затухание для из компонентов полосы составляет 80 дБ. Также то, что максимальное искажение для компонентов интереса составляет 0,05 дБ (половина неравномерности в полосе пропускания от пика к пику). Фильтр equiripple, который соответствует этим спецификациям, может быть легко получен fdesign интерфейс.

eqrDecim = design(fdDecim,'equiripple', 'SystemObject', true);
measure(eqrDecim)
ans = 

Sample Rate      : 800 Hz     
Passband Edge    : 80 Hz      
3-dB Point       : 85.621 Hz  
6-dB Point       : 87.8492 Hz 
Stopband Edge    : 100 Hz     
Passband Ripple  : 0.092414 dB
Stopband Atten.  : 80.3135 dB 
Transition Width : 20 Hz      
 

Визуализируйте ответ величины, подтверждает, что фильтр является фильтром equiripple.

fvtool(eqrDecim)

Фильтры Найквиста и непротиворечивость интерполяции

Цифровой фильтр свертки$h$ называется фильтром Найквиста L-th, если он исчезает периодически каждый$L$ выборки, кроме центрального индекса. Другими словами, выборка$h$ на коэффициент$L$ выражений импульс:

$$h[kL] = \delta_k$$

$L$-th идеал полосы lowpass$h[m] = sinc(\frac{m}{L})$, например, является$L$-th фильтром Найквиста. Другим примером является треугольное окно.

L=3;
t = linspace(-3*L,3*L,1024);
n = (-3*L:3*L);
hLP = @(t) sinc(t/L);
hTri = @(t) (1-abs(t/L)).*(abs(t/L)<=1);

plot_nyquist_filter(t,n,hLP,hTri,L);

Функциональный designMultirateFIR фильтры Найквиста выражений, поскольку это основано на взвешенных и усеченных версиях идеала фильтры Найквиста.

Фильтры Найквиста эффективны, чтобы реализовать, поскольку часть L-th коэффициентов в этих фильтрах является нулем, который сокращает количество необходимого умножения. Эта функция делает эти фильтры эффективными и для децимации и для интерполяции.

Непротиворечивость интерполяции

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

Непротиворечивость интерполяции содержит в фильтре Найквиста, начиная с коэффициентов, равных нулю каждый выборки L (за исключением в центре). Доказательство является прямым. Примите, что это$x_L$ - сверхдискретизированная версия$x$ (с нулями, вставленными между выборками) так, чтобы$x_L[Ln]=x[n]$, и это$y=h*x_L$ было интерполированным сигналом. Произведите$y$ однородно и получите следующее уравнение.

$$ y[nL] = (h*x_L)[Ln] = \sum_k h[Ln-k] x_L[k] = \sum_m \underbrace{h[Ln-Lm]}_{\delta[L(n-m)]} x_L[Lm] = x_L[Ln] = x[n]$$

Давайте исследуем эффект использования фильтра Найквиста для интерполяции. designMultirateFIR функция производит фильтры Найквиста. Как вы видите в описании ниже, входные значения совпадают с интерполированными значениями.

% Generate input
n = (0:20)';
xInput = (n<=10).*cos(pi*0.05*n).*(-1).^n;

L = 4;
hNyq = designMultirateFIR(L,1);
firNyq = dsp.FIRInterpolator(L,hNyq);
xIntrNyq = firNyq(xInput);
release(firNyq);
plot_shape_and_response(hNyq,xIntrNyq,xInput,L,num2str(L)+"-Nyuist");

Дело обстоит не так для других фильтров lowpass, таких как проекты equiripple, как замечено в рисунке ниже. Обратите внимание на то, что интерполированная последовательность не совпадает с входными значениями с низкой ставкой. С другой стороны, искажение может быть ниже в фильтрах нон-Найквиста как компромисс для непротиворечивости интерполяции.

hNotNyq = firpm(length(hNyq)-1,[0 1/L 1.5/L 1],[1 1 0 0]);
hNotNyq = hNotNyq/max(hNotNyq); % Adjust gain
firIntrNotNyq = dsp.FIRInterpolator(L,hNotNyq);
xIntrNotNyq= firIntrNotNyq(xInput);
release(firIntrNotNyq);

plot_shape_and_response(hNotNyq,xIntrNotNyq,xInput,L,"equiripple, not Nyquist");

Смотрите также

Функции

Объекты

Похожие темы