Основы цифровой обработки сигналов
Многоскоростные системы
Основные определения
Многоскоростные системы (multirate) – это цифровые системы, в которых присутствуют сигналы с различными частотами дискретизации.
Здесь мы будем рассматривать только системы, которые преобразовывают частоту дискретизации входного сигнала.
Общая схема простейшей многоскоростной системы представлена на рисунке: на вход системы поступает сигнал с одной частотой дискретизации, на выходе получается сигнал с другой частотой дискретизации.
Если происходит понижение частоты дискретизации, то этот процесс называется децимацией (decimation или downsampling). Если частота дискретизации повышается, то этот процесс называется апсэмплингом (upsampling) или интерполяцией.
Понижение частоты дискретизации
Рассмотрим случай децимации, когда частота дискретизации понижается в целое число раз. Это прореживание отсчетов, при котором в выходном сигнале остается только каждый -й отсчет, а остальные отсчеты выбрасываются.
При этом может возникнуть одна проблема: мы можем не соблюсти условие теоремы Котельникова. Мы осуществляем дискретизацию сигнала на другой шкале дискретных отсчетов времени. Из-за эффекта алиасинга мы можем потерять данные, и восстановить исходный сигнал не получится. Поэтому на практике применяется операция децимации – прореживание с предварительной фильтрацией для гарантированного соблюдения условий теоремы Котельникова.
Пример понижения частоты дискретизации в Engee
Рассмотрим пример понижения частоты дискретизации сигнала в Engee. Мы формируем исходный сигнал – сумму синусоид с частотами 1000 Гц и 3400 Гц, а затем понижаем частоту дискретизации в целое число раз. Исходная частота дискретизации равна 30 кГц. Построим сигнал во временной и частотной областях.
using Plots, DSP;
fs = 30000;
t1 = [0:1/fs:0.02;];
f1 = 1000;
x1 = cos.(2*pi*f1*t1);
f2 = 3400;
x2 = 0.5*cos.(2*pi*f2*t1);
s = x1 + x2;
plot(t1, s, xlabel="t", ylabel="исходный сигнал", legend=false)
y = DSP.periodogram(s, onesided=true, nfft=length(s), fs=fs, window=hamming);
plot(freq(y), power(y), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
На спектре сигнала мы видим пики на частотах 1000 Гц и 3400 Гц.
Сначала понизим частоту дискретизации в 3 раза с помощью функции resample, содержащейся в библиотеке DSP.
down = 3;
s_down = DSP.resample(s, 1/down);
t2 = [0:1/(fs/down):0.02;];
plot(t2, s_down, xlabel="t", ylabel="прореженный сигнал", legend=false)
y_down = DSP.periodogram(s_down, onesided=true, nfft=length(s_down), fs=fs/down, window=hamming);
plot(freq(y_down), power(y_down), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
На спектре прореженного сигнала также наблюдаются пики на частотах 1000 Гц и 3400 Гц. При этом мы понизили частоту дискретизации до 10 кГц. Зона Найквиста (половина частоты дискретизации) в этом случает равна 5 кГц.
Что будет, если понизить частоту дискретизации в 6 раз? Тогда зона Найквиста сдвинется на 2,5 кГц и пик на частоте 3400 Гц исчезнет из спектра.
down = 6;
s_down = DSP.resample(s, 1/down);
y_down = DSP.periodogram(s_down, onesided=true, nfft=length(s_down), fs=fs/down, window=hamming);
plot(freq(y_down), power(y_down), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
Повышение частоты дискретизации
Апсэмплинг (Upsampling) – это повышение частоты дискретизации в целое число раз (в раз) за счет помещения нулей между отсчетами сигнала.
Repeat – повторение отсчетов сигнала раз.
Оба эти способа серьезно искажают форму сигнала, и зачастую это неприемлемо. Поэтому обычно используют интерполяцию (interpolation) – помещение промежуточных аппроксимированных значений сигнала между реальными отсчетами.
Пример повышения частоты дискретизации в Engee
Рассмотрим пример повышения частоты дискретизации в Engee. Исходный сигнал – синусоида с основной частотой 1000 Гц и частотой диксретизации 8000 Гц. Посмотрим на нее во временной и частотной областях.
using Plots, DSP;
fs = 8000;
t1 = [0:1/fs:0.01;];
f0 = 1000;
x = cos.(2*pi*f0*t1);
plot(t1, x, xlabel="t", ylabel="исходный сигнал", legend=false)
y = DSP.periodogram(x, onesided=true, nfft=length(x), fs=fs, window=hamming);
plot(freq(y), power(y))
На спектре мы наблюдаем один пик на частоте 1000 Гц, а зона наблюдения спектра ограничивается частотой 4 кГц.
Повысим частоту дискретизации сигнала в 3 раза с использованием интерполяции (с помощью той же функции resample).
up = 3;
x_up = DSP.resample(x, up);
y_up = DSP.periodogram(x_up, onesided=true, nfft=length(x_up), fs=fs*up, window=hamming);
plot(freq(y_up), power(y_up), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)
Проблемы, возникающие при изменении частоты дискретизации
При понижении частоты дискретизации достаточно пропустить сигнал через фильтр нижних частот, у которого частота среза будет не более половины частоты дискретизации выходного прореженного сигнала. После фильтрации необходимо выполнить операцию децимации. Такая схема позволяет гарантированно избежать алиасинга. Такой фильтр называется антиалиасинговым.

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

Стандартная схема интерполяции: сперва выполняется операция апсэмплинга (вставки нулей), а затем фильтрация антиимиджинговым фильтром. Во временной области сигнал сглаживается, и резкие перепады в ноль из положительных и отрицательных значений усредняются.
Изменение частоты дискретизации в дробное число раз
Если необходимо изменить частоту дискретизации в дробное число раз, то это можно сделать, совместив операции интерполяции и децимации в целое число раз. Отношение коэффициентов даст дробное значение коэффициента изменения частоты дискретизации. Сначала осуществляется интерполяция в раз, затем фильтрация фильтром нижних частот (один фильтр используется и как антиимиджинговый, и как антиалиасинговый) и наконец децимация в раз. Частоту среза ФНЧ надо всегда выбирать наименьшей из двух доступных.
Функция resample в Engee изменяет частоту дискретизации сигнала в любое рациональное число раз в соответствии с приведенной выше последовательностью.
✏️Задание
С помощью функции resample измените в Engee частоту дискретизации сигнала в раза. Исходный сигнал – синусоида на частоте 1000 Гц с частотой дискретизации 8000 Гц. Постройте спектр выходного сигнала.
Решение
using Plots, DSP;
fs = 8000;
t1 = [0:1/fs:0.01;];
f0 = 1000;
x = cos.(2*pi*f0*t1);
coeff = 4/5;
s = DSP.resample(x, coeff);
y = DSP.periodogram(s, onesided=true, nfft=length(s), fs=fs*coeff, window=hamming);
plot(freq(y), power(y), xlabel="частота, Гц", ylabel="спектральная плотность мощности", legend=false)