В этом примере показано, как спроектировать фильтры для децимации и интерполяции дискретных рядов.
Преобразование уровня является процессом изменения уровня дискретного сигнала получить новое дискретное представление базового непрерывного сигнала. Процесс включает универсальную субдискретизацию и повышающую дискретизацию. Универсальная субдискретизация уровнем 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.
При субдискретизации уровнем, фильтр lowpass, примененный до субдискретизации пределов входная полоса пропускания и таким образом устранение искажения спектра. Это похоже на аналоговый LPF, используемый в конвертерах A/D. Идеально, такой фильтр сглаживания имеет модульное усиление и частоту среза, вот частота Найквиста сигнала. Примечание: базовая частота дискретизации незначительна, мы принимаем нормированные частоты (i.e). в течение обсуждения.
При повышающей дискретизации уровнем фильтр lowpass, примененный после того, как, повышающая дискретизация известна как реконструкционный фильтр. Фильтр удаляет спектральные изображения сигнала с низкой ставкой. Идеально, частота среза этого реконструкционного фильтра (как его дубликат сглаживания), в то время как его усиление.
И повышающая дискретизация и субдискретизация операций уровня требуют фильтра lowpass с нормированной частотой среза. Единственная разница находится в необходимом усилении и размещении фильтра (перед или после преобразования уровня).
Комбинация повышающей дискретизации сигнала на коэффициент, сопровождаемый путем фильтрации, и затем субдискретизации на коэффициент преобразований частоты дискретизации последовательности рациональным фактором. Это получено путем повышающей дискретизации уровнем, сопровождаемым путем фильтрации, затем субдискретизации уровнем. Порядок операции преобразования уровня не может коммутироваться. Один фильтр, который комбинирует сглаживание и антиобработку изображений, помещается между повышающей дискретизацией и этапами субдискретизации. Этим фильтром является lowpass с нормированной частотой среза и усилением.
В то время как любая КИХ-функция проекта lowpass (например, fir1
, firpm
, или fdesign
) мог спроектировать соответствующее сглаживание и реконструкционный фильтр, функциональный designMultirateFIR
дает удобное и упрощенный интерфейс. Следующие несколько разделов показывают использование этих функций, чтобы спроектировать фильтр и продемонстрировать почему designMultirateFIR
предпочтительный путь.
Фильтрованные преобразования уровня включают decimators, интерполяторы и рациональные конвертеры уровня, все из которых являются каскадами блоков изменения уровня с, просачиваются различные настройки.
Фильтрованное Преобразование Уровня с помощью filter
, upsample
, и downsample
функции
Децимация относится к фильтрации LTI, сопровождаемой универсальной субдискретизацией. КИХ decimator может быть реализован можно следующим образом.
Проект a сглаживающийся фильтр lowpass h
Отфильтруйте вход хотя h
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)
автоматически находит соответствующее масштабирование и частоту среза для данного отношения преобразования уровня. Используйте КИХ-коэффициенты, возвращенные designMultirateFIR
с dsp.FIRDecimator
(если), dsp.FIRInterpolator
(если), или 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
(обозначенный впредь).
Вначале существует переходный процесс.
Чтобы выдержать сравнение, выровняйте и масштабируйте области времени этих двух последовательностей. Интерполированный демонстрационный xUp[k]
соответствует входному времени.
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]);
Та же идея работает на субдискретизацию, где преобразование времени:
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));
Общие рациональные преобразования могут быть обработаны тот же путь как повышающая дискретизация и субдискретизация. Сокращение, и усиление. Функциональный 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);
Постройте вход и фильтр выход с временной регулировкой, данной.
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]);
Используя 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. 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)
Функциональный 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)
Цифровой фильтр свертки называется фильтром Найквиста L-th, если он исчезает периодически каждый выборки, кроме центрального индекса. Другими словами, выборка на коэффициент выражений импульс:
-th идеал полосы lowpass, например, является-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 (за исключением в центре). Доказательство является прямым. Примите, что это - сверхдискретизированная версия (с нулями, вставленными между выборками) так, чтобы, и это было интерполированным сигналом. Произведите однородно и получите следующее уравнение.
Давайте исследуем эффект использования фильтра Найквиста для интерполяции. 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");
dsp.FIRDecimator
| dsp.FIRInterpolator
| dsp.FIRRateConverter
| dsp.FIRHalfbandDecimator
| dsp.FIRHalfbandInterpolator