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

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

Введение

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

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

Удобный способ просмотреть эффект нелинейности усилителя состоит в том, чтобы просмотреть периодограмму своего выхода, когда стимулировано с синусоидой. Амплитуда синусоиды установлена в максимальное допустимое напряжение усилителя. (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. Это обеспечивает разумный компромисс в приложениях, которые используют полную пропускную способность усилителя.

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

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