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

sinad

Отношение сигнала к сумме шума и искажений.

Библиотека

EngeeDSP

Синтаксис

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

  • r = sinad(x) — возвращает отношение сигнала к сумме шума и искажений (SIgnal to Noise And Distortion ratio, SINAD) в дБн для вещественного синусоидального сигнала x. SINAD определяется с помощью модифицированной периодограммы той же длины, что и входной сигнал. Модифицированная периодограмма использует окно Кайзера с .

  • r = sinad(x,fs) — определяет частоту дискретизации fs входного сигнала x. Если аргумент fs не задан, частота дискретизации по умолчанию равна 1.

  • r = sinad(pxx,f,"psd") — определяет входной аргумент pxx как одностороннюю оценку спектральной плотности мощности (СПМ). Аргумент f — вектор частот, соответствующих оценкам СПМ в pxx.

  • r = sinad(sxx,f,rbw,"power") — определяет входной сигнал как односторонний спектр мощности. Аргумент rbw — полоса разрешения, в которой интегрируется каждая оценка мощности.

  • r,totdistpow = sinad(___) — возвращает общий уровень шума и гармонических искажений сигнала (в дБ).

  • sinad(___, out=:plot) — строит спектр сигнала в текущем окне графиков и отмечает его основную составляющую. Основная составляющая, значение постоянной составляющей и шум отображаются разными цветами. Значение SINAD отображается над графиком.

Аргументы

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

# x — вещественный синусоидальный входной сигнал
вектор

Details

Вещественный синусоидальный входной сигнал, заданный как вектор-строка или вектор-столбец.

Типы данных

Float32, Float64

# fs — частота дискретизации
положительный скаляр

Details

Частота дискретизации, заданная как положительный скаляр. Частота дискретизации — это количество отсчетов в единицу времени. Если единицей времени являются секунды, то частота дискретизации измеряется в Гц.

# pxx — односторонняя оценка СПМ
вектор

Details

Односторонняя оценка СПМ, заданная как вещественный неотрицательный вектор-столбец.

Спектральная плотность мощности должна быть выражена в линейных единицах, а не в децибелах.

Типы данных

Float32, Float64

# f — циклические частоты
вектор

Details

Циклические частоты, соответствующие односторонней оценке СПМ pxx, заданные в виде вектора-строки или вектора-столбца. Первый элемент f должен быть равен 0.

Типы данных

Float64, Float32

# sxx — спектр мощности
неотрицательный вещественный вектор-строка или вектор-столбец

Details

Спектр мощности, заданный как вещественный вектор-строка или вектор-столбец.

Спектр мощности должен быть выражен в линейных единицах, а не в децибелах.

# rbw — полоса разрешения
положительный скаляр

Details

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

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

# r — отношение сигнала к сумме шума и искажений
вещественный скаляр

Details

Отношение сигнала к сумме шума и искажений в дБн, возвращаемое в виде вещественного скаляра.

# totdistpow — общая мощность шума и гармонических искажений сигнала
вещественный скаляр

Details

Общая мощность шума и гармонических искажений сигнала, возвращаемая в виде вещественного скаляра, выраженного в дБ.

Примеры

SINAD для сигнала с одной гармоникой или одной гармоникой плюс шум

Details

Создадим два сигнала. Оба сигнала имеют основную частоту рад/отсчет с амплитудой 1 и первую гармонику с частотой рад/отсчет с амплитудой 0.025. Один из сигналов дополнительно содержит аддитивный белый гауссовский шум с дисперсией .

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

import EngeeDSP.Functions: randn, sinad
using Random

n = 0:159
x = cos.(π/4*n) + 0.025 * sin.(π/2*n)

Random.seed!(123)

y = cos.(π/4*n) + 0.025 * sin.(π/2*n) + 0.05 * randn(length(n), 1)
r = sinad(x)
println("r = ", r[1])
r = 32.041199826559314
powfund = 1
powharm = 0.025^2
thSINAD = 10 * log10(powfund / powharm)
println("thSINAD = ", thSINAD)
thSINAD = 32.04119982655924

Определим SINAD для синусоидального сигнала с аддитивным шумом. Покажем, как включение теоретической дисперсии аддитивного шума аппроксимирует SINAD.

r = sinad(y)
println("r = ", r[1])
r = 24.588862275561493
varnoise = 0.05^2
thSINAD = 10 * log10(powfund / (powharm + varnoise))
println("thSINAD = ", thSINAD)
thSINAD = 25.05149978319906

SINAD для сигнала с частотой дискретизации

Details

Создадим сигнал с основной частотой 1 кГц и единичной амплитудой, дискретизированный с частотой 480 кГц. Сигнал дополнительно содержит первую гармонику с амплитудой 0.02 и аддитивный белый гауссовский шум с дисперсией .

Определим SINAD и сравним результат с теоретическим SINAD.

import EngeeDSP.Functions: randn, sinad
using Random

fs = 48e4
t = 0:1/fs:1-1/fs

Random.seed!(123)

x = cos.(2π*1000*t) + 0.02 * sin.(2π*2000*t) + 0.01 * randn(length(t), 1)
r = sinad(x, fs)
println("r = ", r[1])
r = 32.243478303520384
powfund = 1
powharm = 0.02^2
varnoise = 0.01^2
thSINAD = 10 * log10(powfund / (powharm + varnoise * (1 / fs)))
println("thSINAD = ", thSINAD)
thSINAD = 33.97939782477054

SINAD усиленного сигнала

Details

Сгенерируем синусоиду частотой 2.5 кГц с частотой дискретизации 50 кГц. Добавим к сигналу гауссовский белый шум со стандартным отклонением 0.00005. Пропустим результат через усилитель с малой нелинейностью. Построим график SINAD.

import EngeeDSP.Functions: randn, polyval, sinad

fs = 5e4
f0 = 2.5e3
N = 1024
t = (0:N-1) / fs

ct = cos.(2π*f0*t)
cd_signal = ct + 0.00005 * randn(length(ct),1)

amp = [1e-5 5e-6 -1e-3 6e-5 1 25e-3]
sgn = polyval(amp, cd_signal)

sinad(sgn, fs, out=:plot)

sinad

На графике показан спектр, используемый для вычисления отношения, и область, рассматриваемая как шум. Уровень постоянной составляющей и основная гармоника исключены из вычисления шума. Основная гармоника отмечена.

Дополнительно

Функции измерения искажений

Details

Функции sfdr, sinad и snr измеряют отклик слабонелинейной системы, возбуждаемой синусоидой.

При задании входных данных во временной области функция sinad строит периодограмму, используя окно Кайзера с большим ослаблением боковых лепестков. Чтобы найти основную частоту, алгоритм ищет на периодограмме наибольшую ненулевую спектральную составляющую. Затем он вычисляет центральный момент всех соседних интервалов, монотонно убывающих при удалении от максимума. Для обнаружения основная частота должна находиться как минимум во втором интервале частоты. Высшие гармоники находятся на частотах, кратных основной частоте. Если гармоника находится в монотонно убывающей области рядом с другой, ее мощность считается принадлежащей большей гармонике. Эта большая гармоника может быть основной, а может и не быть.

Функция оценивает уровень шума, используя медианное значение мощности в областях, содержащих только шум и искажения. Постоянная составляющая исключается из расчета. Шум в каждой точке определяется расчетным уровнем или ординатой точки, в зависимости от того, что меньше. Затем шум вычитается из значений сигнала и гармоник.

Функция sinad завершается ошибкой, если основная частота не является наивысшей спектральной составляющей сигнала.

Убедитесь, что частотные компоненты достаточно разнесены, чтобы учесть ширину боковых лепестков окна Кайзера. Если это невозможно, можно использовать флаг "power" и вычислить периодограмму с другим окном.