upfirdn
Повышение частоты дискретизации, применение КИХ-фильтра и понижение частоты дискретизации.
| Библиотека |
|
Аргументы
Входные аргументы
#
h —
импульсная характеристика
вектор | матрица
Details
Импульсная характеристика фильтра, заданная как вектор или матрица. Если h — вектор, то он представляет один КИХ-фильтр. Если h — матрица, то каждый столбец представляет собой импульсную характеристику отдельного КИХ-фильтра. Для получения более подробной информации см. Советы.
| Типы данных |
|
#
p —
коэффициент повышения частоты дискретизации
1 (по умолчанию) | положительное целое число
Details
Коэффициент повышения частоты дискретизации, заданный как положительное целое число.
| Типы данных |
|
#
q —
коэффициент понижения частоты дискретизации
1 (по умолчанию) | положительное целое число
Details
Коэффициент понижения частоты дискретизации, заданный как положительное целое число.
| Типы данных |
|
Примеры
Преобразование частоты дискретизации DAT в частоту дискретизации CD
Details
Изменим частоту дискретизации сигнала с помощью рационального коэффициента преобразования из частоты дискретизации DAT 48 кГц в частоту дискретизации CD 44.1 кГц. С помощью функции rationalize найдем числитель L и знаменатель M рационального коэффициента.
import EngeeDSP.Functions: upfirdn, kaiserord, fir1, kaiser
Fdat = 48e3
Fcd = 44.1e3
r = rationalize(Fcd/Fdat)
L = numerator(r)
M = denominator(r)
println("L=",L,", M=",M)
L=147, M=160
Сгенерируем синусоиду частотой 1.5 кГц с периодом дискретизации равной 0.25 с. Отобразим на графике первую миллисекунду сигнала.
t = 0:1/Fdat:0.25-1/Fdat
x = sin.(2π * 1.5e3 * t)
scatter(t, x, markershape=:circle, markersize=3, line=:stem, label="signal")
xlims!(0, 0.001)

Спроектируем фильтр нижних частот со сглаживанием, используя окно Кайзера. Установим границы полосы фильтра на уровне 90% и 110% от частоты среза, . Зададим пульсации в полосе пропускания 5 дБ и затухание в полосе задерживания 40 дБ. Установим коэффициент усиления в полосе пропускания равным L.
Fs = 48e3
f = (Fdat/2) * min(1/L, 1/M)
Wp = 0.9*f / (Fs/2)
Ws = 1.1*f / (Fs/2)
Rp = 5
Rs = 40
n, Wn, beta = kaiserord([Wp, Ws], [1, 0], [10^(-Rp/20), 10^(-Rs/20)])
b = fir1(n, Wn, kaiser(n+1, beta))
h = L * b
Используем функцию upfirdn с фильтром h для передискретизации синусоиды. Вычислим и компенсируем задержку, вносимую фильтром. Сгенерируем соответствующий передискретизированный временной вектор.
y = upfirdn(x, h, L, M)
delay_float = ((length(h) - 1) / 2 - (L - 1)) / L
delay = floor(Int, delay_float)
y = y[delay+1:end]
t_res = (0:length(y)-1) / Fcd
Отобразим на графике исходный и передискретизированный сигнал.
plot(t, x, line=:stem, marker=:circle, markersize=2,
label="Original (48 kHz)", color=:red,
xlims=(0, 0.001), title="Signal Comparison",
xlabel="Time (s)", ylabel="Amplitude")
scatter!(t_res, y, markershape=:circle, markersize=2,
label="Resampled (44.1 kHz)", color=:blue)

Советы
-
xin— вектор иh— вектор.На входе один фильтр и один сигнал, поэтому функция свертывает
xinсh. Выходной сигналyoutявляется вектором-строкой, еслиxin— вектор-строка; в противном случаеyout— вектор-столбец. -
xin— матрица, аh— вектор.На входе один фильтр и много сигналов, поэтому функция свертывает
hс каждым столбцомxin. Результирующаяyout— матрица с тем же количеством столбцов, что иxin. -
xin— вектор, аh— матрица.На входе несколько фильтров и один сигнал, поэтому функция свертывает каждый столбец
hсxin. Результирующаяyout— матрица с тем же количеством столбцов, что иh. -
xin— матрица иh— матрица, обе с одинаковым количеством столбцов.На входе несколько фильтров и несколько сигналов, поэтому функция свертывает соответствующие столбцы
xinиh. Результирующаяyout— матрица с тем же числом столбцов, что иxinиh.
Алгоритмы
Функция upfirdn использует полифазную интерполяционную структуру. Количество операций умножения-суммирования в полифазной структуре приблизительно равно , где и — длины и соответственно. Для длинных сигналов эта формула часто оказывается точной.
Функция upfirdn выполняет каскад из трех операций:
-
Повышение частоты дискретизации входных данных в матрице
xinна целочисленный коэффициентp(добавление нулей). -
КИХ-фильтрация для сигнала с повышенной частотой дискретизации с последовательностью импульсной характеристики, заданной в виде вектора или матрицы
h. -
Понижение частоты дискретизации на целочисленный коэффициент
q(отбрасывание отсчетов).
Литература
-
Crochiere, R. E. A General Program to Perform Sampling Rate Conversion of Data by Rational Ratios. Programs for Digital Signal Processing (Digital Signal Processing Committee of the IEEE Acoustics, Speech, and Signal Processing Society, eds.). New York: IEEE Press, 1979, Programs 8.2-1–8.2-7.
-
Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.