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