Документация Engee

upfirdn

Повышение частоты дискретизации, применение КИХ-фильтра и понижение частоты дискретизации.

Библиотека

EngeeDSP

Синтаксис

Вызов функции

  • yout = upfirdn(xin,h) — фильтрует входной сигнал xin с помощью КИХ-фильтра с импульсной характеристикой h. В этом синтаксисе не реализовано повышение и понижение частоты дискретизации.

  • yout = upfirdn(xin,h,p) — использует целочисленный коэффициент повышения частоты дискретизации p.

  • yout = upfirdn(xin,h,p,q) — использует целочисленный коэффициент понижения частоты дискретизации q.

Аргументы

Входные аргументы

# xin — входной сигнал
вектор | матрица

Details

Входной сигнал, заданный как вектор или матрица. Если xin — вектор, то он представляет собой один сигнал. Если xin — матрица, то каждый столбец фильтруется независимо. Для получения более подробной информации см. Советы.

Типы данных

Float32, Float64

# h — импульсная характеристика
вектор | матрица

Details

Импульсная характеристика фильтра, заданная как вектор или матрица. Если h — вектор, то он представляет один КИХ-фильтр. Если h — матрица, то каждый столбец представляет собой импульсную характеристику отдельного КИХ-фильтра. Для получения более подробной информации см. Советы.

Типы данных

Float32, Float64

# p — коэффициент повышения частоты дискретизации
1 (по умолчанию) | положительное целое число

Details

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

Типы данных

Float32, Float64

# q — коэффициент понижения частоты дискретизации
1 (по умолчанию) | положительное целое число

Details

Коэффициент понижения частоты дискретизации, заданный как положительное целое число.

Типы данных

Float32, Float64

Выходные аргументы

# yout — выходной сигнал
вектор | матрица

Details

Выходной сигнал, возвращаемый в виде вектора или матрицы. Каждый столбец yout имеет длину ceil(length(xin) − 1) * p + length(h / q).

Если входной сигнал xin имеет одинарную точность, то yout тоже будет иметь одинарную точность.

Поскольку upfirdn выполняет свертку и изменение частоты дискретизации, то выходные сигналы yout имеют длину, отличную от длины входных сигналов xin. Количество строк yout примерно в p/q раз больше количества строк xin.

Примеры

Преобразование частоты дискретизации 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)

upfirdn 1

Спроектируем фильтр нижних частот со сглаживанием, используя окно Кайзера. Установим границы полосы фильтра на уровне 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)

upfirdn 2

Советы

Допустимыми комбинациями размеров xin и h являются:

  1. xin — вектор и h — вектор.

    На входе один фильтр и один сигнал, поэтому функция свертывает xin с h. Выходной сигнал yout является вектором-строкой, если xin — вектор-строка; в противном случае yout — вектор-столбец.

  2. xin — матрица, а h — вектор.

    На входе один фильтр и много сигналов, поэтому функция свертывает h с каждым столбцом xin. Результирующая yout — матрица с тем же количеством столбцов, что и xin.

  3. xin — вектор, а h — матрица.

    На входе несколько фильтров и один сигнал, поэтому функция свертывает каждый столбец h с xin. Результирующая yout — матрица с тем же количеством столбцов, что и h.

  4. xin — матрица и h — матрица, обе с одинаковым количеством столбцов.

    На входе несколько фильтров и несколько сигналов, поэтому функция свертывает соответствующие столбцы xin и h. Результирующая yout — матрица с тем же числом столбцов, что и xin и h.

Алгоритмы

Функция upfirdn использует полифазную интерполяционную структуру. Количество операций умножения-суммирования в полифазной структуре приблизительно равно , где и — длины и соответственно. Для длинных сигналов эта формула часто оказывается точной.

Функция upfirdn выполняет каскад из трех операций:

  1. Повышение частоты дискретизации входных данных в матрице xin на целочисленный коэффициент p (добавление нулей).

  2. КИХ-фильтрация для сигнала с повышенной частотой дискретизации с последовательностью импульсной характеристики, заданной в виде вектора или матрицы h.

  3. Понижение частоты дискретизации на целочисленный коэффициент q (отбрасывание отсчетов).

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

Функция resample выполняет проектирование КИХ-фильтра с использованием firls, а затем изменение частоты дискретизации с помощью upfirdn.

Литература

  1. 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.

  2. Crochiere, R. E., and Lawrence R. Rabiner. Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice-Hall, 1983.