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

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

Введение

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

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

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

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

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')

Figure contains an axes. The axes with title Amplifier output contains an object of type line.

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

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

Figure contains an axes. The axes with title Periodogram Power Spectrum Estimate contains 3 objects of type line, text.

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

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

Количественная оценка нелинейных искажений

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

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

thd(outputVmax, Fs)

Figure contains an axes. The axes with title THD: -60.39 dB contains 16 objects of type line, text. These objects represent Fundamental, Harmonics, DC and Noise (excluded).

ans = -60.3888

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

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

snr(outputVmax, Fs)

Figure contains an axes. The axes with title SNR: 130.93 dB contains 17 objects of type line, text. These objects represent Fundamental, Noise, DC and Harmonics (excluded).

ans = 130.9300

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

sinad(outputVmax, Fs)

Figure contains an axes. The axes with title SINAD: 60.39 dB contains 7 objects of type line, text. These objects represent Fundamental, Noise and Distortion, DC (excluded).

ans = 60.3888

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

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

Вход сигнала для уменьшения гармонических искажений

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

Повторим измерения, снизив входное напряжение в два раза.

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

Figure contains an axes. The axes with title Periodogram Power Spectrum Estimate contains 3 objects of type line, text.

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

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')

Figure contains an axes. The axes with title Distortion Metrics vs. Input Attenuation contains 3 objects of type line. These objects represent |THD|, SNR, SINAD.

График показывает полезную динамическую область значений, соответствующий каждой метрике. Величина 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');

Figure contains an axes. The axes with title Periodogram Power Spectrum Estimate contains 4 objects of type line, text.

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

Постобработка для удаления искажений

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

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

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')

Figure contains 2 axes. Axes 1 with title Uncorrected contains an object of type line. Axes 2 with title Polynomial Corrected contains an object of type line.

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

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

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');

Figure contains an axes. The axes with title Distortion Metrics vs. Input Attenuation and Polynomial Correction contains 6 objects of type line. These objects represent |THD| (uncorrected), SNR (uncorrected), SINAD (uncorrected), |THD| (corrected), SNR (corrected), SINAD (corrected).

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

Как видно из графика, 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

Хороший выбор ослабления усилителя для полиномиального корректируемого усилителя был бы 20dB (получая 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')

Figure contains an axes. The axes with title Periodogram of attenuated and polynomial corrected amplifier contains 4 objects of type line, text.

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

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

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

См. также

| |