Анализ гармонического искажения

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

Введение

В этом примере мы исследуем вывод упрощенной модели усилителя, который имеет шум, связанный с входным сигналом, и показывает нелинейность. Мы исследуем, как затухание во входе может уменьшать гармоническое искажение. Мы также дадим пример того, как математически исправить для искажения при выводе усилителя.

Просмотр эффектов нелинейности

Удобный способ просмотреть эффект нелинейности усилителя состоит в том, чтобы просмотреть периодограмму своего вывода, когда стимулировано с синусоидой. Амплитуда синусоиды установлена в максимальное допустимое напряжение усилителя. (2 Vpk)

В этом примере мы получим синусоиду на 2 кГц на срок 50 мс.

VmaxPk = 2;       % Maximum operating voltage
Fi = 2000;        % Sinusoidal frequency of 2 kHz
Fs = 44.1e3;      % Sample rate of 44.1kHz
Tstop = 50e-3;    % Duration of sinusoid
t = 0:1/Fs:Tstop; % Input time vector

% Use the maximum allowable voltage of the amplifier
inputVmax = VmaxPk*sin(2*pi*Fi*t);
outputVmax = helperHarmonicDistortionAmplifier(inputVmax);

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

plot(t, outputVmax)
xlabel('Time')
ylabel('Output Voltage')
axis([0 5e-3 -2.5 2.5])
title('Amplifier output')

Теперь давайте просмотрим периодограмму нашего усилителя вывод.

helperPlotPeriodogram(outputVmax, Fs, 'power','annotate');

Обратите внимание на то, что вместо того, чтобы видеть только синусоиду на 2 кГц, которую мы поместили во входе, мы видим другие синусоиды на уровне 4 кГц, 6 кГц, 8 кГц и 10 кГц. Эти синусоиды являются множителями основной частоты на 2 кГц и происходят из-за нелинейности усилителя.

Мы также видим относительно плоскую полосу шумовой степени.

Определение количества нелинейного искажения

Давайте исследуем некоторые общие метрики искажения на цели сравнения

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

thd(outputVmax, Fs)

ans = -60.3888

Заметьте, что третья и самая большая гармоника составляет приблизительно 60 дБ вниз от основного принципа. Это - то, где большая часть искажения происходит.

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

snr(outputVmax, Fs)

ans = 130.9300

Другая полезная метрика, чтобы вычислить является SINAD. Это вычисляет отношение степени ко всему другому гармоническому и шумовому содержимому в сигнале.

sinad(outputVmax, Fs)

ans = 60.3888

THD, ОСШ и SINAD составляли-60 дБ, 131 дБ и 60 дБ, соответственно. Поскольку значение THD примерно равно SINAD, мы можем приписать это, большая часть искажения происходит из-за гармонического искажения.

Если мы осматриваем периодограмму, мы можем заметить, что третья гармоника доминирует над искажением вывода.

Введите затухание, чтобы уменьшать гармоническое искажение

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

Давайте повторим измерения путем понижения входного напряжения фактором два.

inputVhalf = (VmaxPk/2) * sin(2*pi*Fi*t);
outputVhalf = helperHarmonicDistortionAmplifier(inputVhalf);
helperPlotPeriodogram(outputVhalf, Fs, 'power','annotate');

Давайте восстановим наши метрики снова, на этот раз измеряя эффект понижения входного напряжения.

thdVhalf = thd(outputVhalf, Fs)
thdVhalf = -72.0676
snrVhalf = snr(outputVhalf, Fs)
snrVhalf = 124.8767
sinadVhalf = sinad(outputVhalf, Fs)
sinadVhalf = 72.0676

Заметьте, что просто ослабление уровня входной мощности на 6 дБ уменьшает гармоническое содержимое. SINAD и THD, улучшенный от ~60 дБ до ~72 дБ. Это прибыло за счет понижения ОСШ от 131 дБ до 125 дБ.

ОСШ THD и SINAD как функция входного затухания

Дальнейшее затухание может улучшать нашу полную производительность искажения? Давайте построим THD, ОСШ и SINAD как функция входного затухания, развертывая входной аттенюатор от 1 до 30 дБ.

% Allocate a table with 30 entries
nReadings = 30;
distortionTable = zeros(nReadings, 3);

% Compute the THD, SNR and SINAD for each of the attenuation settings
for i = 1:nReadings
  inputVbestAtten = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
  outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten);
  distortionTable(i,:) = [abs(thd(outputVbestAtten, Fs))
                          snr(outputVbestAtten, Fs)
                          sinad(outputVbestAtten, Fs)];
end

% Plot results
plot(distortionTable)
xlabel('Input Attenuation (dB)')
ylabel('Dynamic Range (dB)')
legend('|THD|','SNR','SINAD','Location','best')
title('Distortion Metrics vs. Input Attenuation')

График показывает применимый динамический диапазон, соответствующий каждой метрике. Значение THD соответствует области значений, которая свободна от гармоник. Точно так же ОСШ соответствует динамическому диапазону этого, незатронуто шумом; SINAD соответствует общему динамическому диапазону, который свободен от искажения.

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

Также обратите внимание, что значение общего гармонического искажения постоянно улучшается, пока это не пересекает кривую ОСШ, после которой измерение становится нестабильным. Это происходит, когда гармоники "исчезли" ниже шума усилителя.

Практическим выбором затухания усилителя для усилителя составили бы 26 дБ (получение SINAD 103 дБ). Это было бы разумным компромиссом между гармоническим и шумовым искажением.

% Search the table for the largest SINAD reading
[maxSINAD, iAtten] = max(distortionTable(:,3));
fprintf('Max SINAD (%.1f dB) occurs at %.f dB attenuation\n', ...
  maxSINAD, iAtten)
Max SINAD (103.7 dB) occurs at 26 dB attenuation

Давайте построим периодограмму, когда аттенюатор будет установлен в 26 дБ.

inputVbestAtten = db2mag(-iAtten) * VmaxPk * sin(2*pi*Fi*t);
outputVbestAtten = helperHarmonicDistortionAmplifier(inputVbestAtten);
helperPlotPeriodogram(outputVbestAtten, Fs, 'power','annotate','shownoise');

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

Последующая обработка, чтобы удалить искажение

Иногда мы можем исправить для части нелинейности усилителя. Если вывод усилителя оцифрован, мы можем восстановить более полезный динамический диапазон в цифровой форме последующей обработкой полученный вывод и исправляющий для нелинейности математически.

В нашем случае мы стимулируем вход с линейным пандусом и соответствуем полиному третьего порядка что лучшие подгонки вход.

inputRamp = -2:0.00001:2;
outputRamp = helperHarmonicDistortionAmplifier(inputRamp);
polyCoeff = polyfit(outputRamp,inputRamp,3)
polyCoeff = 1×4

    0.0010   -0.0002    1.0000   -0.0250

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

correctedOutputVmax = polyval(polyCoeff, outputVmax);

helperPlotPeriodogram([outputVmax; correctedOutputVmax],Fs,'power');
subplot(2,1,1)
title('Uncorrected')
subplot(2,1,2)
title('Polynomial Corrected')

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

Давайте повторим измерения снова с исправленным выводом.

thdCorrectedVmax = thd(correctedOutputVmax, Fs)
thdCorrectedVmax = -99.6194
snrCorrectedVmax = snr(correctedOutputVmax, Fs)
snrCorrectedVmax = 130.7491
sinadCorrectedVmax = sinad(correctedOutputVmax, Fs)
sinadCorrectedVmax = 99.6162

Заметьте что наш SINAD (и THD) исключенный из 60 дБ вниз к 99 дБ при сохранении нашего исходного ОСШ 131 дБ.

Объединение методов

Мы можем объединить затухание с полиномиальной оценкой, чтобы найти идеальное рабочее напряжение, которое минимизирует полный SINAD нашей системы.

subplot(1,1,1)
% Add three more columns to our distortion table
distortionTable = [distortionTable zeros(nReadings,3)];
for i = 1:nReadings
  inputVreduced = db2mag(-i) * VmaxPk * sin(2*pi*Fi*t);
  outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
  correctedOutput = polyval(polyCoeff, outputVreduced);
  distortionTable(i,4:6) = [abs(thd(correctedOutput, Fs))
                            snr(correctedOutput, Fs)
                            sinad(correctedOutput, Fs)];
end

h = plot(distortionTable)
h = 
  6x1 Line array:

  Line
  Line
  Line
  Line
  Line
  Line

xlabel('Input attenuation (dB)')
ylabel('Dynamic Range (dB)')
for i = 1:3
  h(i+3).Color = h(i).Color;
  h(i+3).LineStyle = '--' ;
end
legend('|THD| (uncorrected)','SNR (uncorrected)','SINAD (uncorrected)', ...
 '|THD| (corrected)','SNR (corrected)','SINAD (corrected)','Location','best')
title('Distortion Metrics vs. Input Attenuation and Polynomial Correction');

Здесь, мы построили все три метрики рядом и для неисправленного и для исправленного усилителя полинома.

Как видно из графика THD значительно улучшился, тогда как ОСШ не был затронут полиномиальным исправлением. Это должно ожидаться, поскольку полиномиальное исправление только влияет на гармоническое искажение а не шумовое искажение.

Давайте покажем максимальный SINAD, возможный, когда исправлено полиномом

[maxSINADcorrected, iAttenCorr] = max(distortionTable(:,6));
fprintf('Corrected:    Max SINAD (%.1f dB) at %.f dB attenuation\n', ...
  maxSINADcorrected, iAttenCorr)
Corrected:    Max SINAD (109.7 dB) at 17 dB attenuation

Хорошим выбором затухания усилителя для исправленного усилителя полинома составят 20 дБ (получение SINAD 109,8 дБ).

% Recompute amplifier at maximum SINAD attenuation setting with polynomial
inputVreduced = db2mag(-iAttenCorr) * VmaxPk * sin(2*pi*Fi*t);
outputVreduced = helperHarmonicDistortionAmplifier(inputVreduced);
correctedOutputVbestAtten = polyval(polyCoeff, outputVreduced);

helperPlotPeriodogram(correctedOutputVbestAtten, Fs, 'power','annotate','shownoise');
title('Periodogram of attenuated and polynomial corrected amplifier')

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

Сводные данные

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

Для просмотра документации необходимо авторизоваться на сайте