matlab 总谐波失真,分析谐波失真 - MATLAB Simulink Example - MathWorks 中国
简介
在此示例中,我们将研究放大器的简化模型的输出,该放大器的噪声耦合到输入信号并且呈现非线性。我们将研究输入端的衰减如何降低谐波失真。我们还将举例说明如何对放大器输出端的失真在数学上进行校正。
查看非线性的影响
查看放大器非线性影响的一种方便方法是查看用正弦波激励时其输出的周期图。正弦波的幅值设置为放大器的最大允许电压。(2 Vpk)
在此示例中,我们将提供持续时间为 50 毫秒的 2 kHz 正弦波。
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 kHz 正弦波,还看到 4 kHz、6 kHz、8 kHz 和 10 kHz 的其他正弦波。这些正弦波是 2 kHz 基频的倍数,这是由于放大器的非线性造成的。
我们还看到相对平坦的噪声功率带。
量化非线性失真
为了便于比较,让我们参考一些常见的失真指标
周期图显示一些定义良好的基波信号的谐波。该图建议我们测量输入信号的总谐波失真,它返回所有谐波含量的功率与基波信号的比率。
thd(outputVmax, Fs)
ans = -60.3888
请注意,第三个(也是最大的)谐波比基波低约 60 dB。大部分失真发生在此处。
我们还可以获得输入中总噪声的估计值。为此,我们调用 SNR,它返回基波功率与所有非谐波含量功率的比率。
snr(outputVmax, Fs)
ans = 130.9300
另一个有用的计算指标是 SINAD。它计算功率与信号中所有其他谐波含量和噪声含量的比率。
sinad(outputVmax, Fs)
ans = 60.3888
THD、SNR 和 SINAD 分别为 -60 dB、131 dB 和 60 dB。由于 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 dB 会降低谐波含量。SINAD 和 THD 从约 60 dB 提高到了约 72 dB。其代价是 SNR 从 131 dB 降低到了 125 dB。
SNR THD 和 SINAD 当作输入衰减的函数
进一步衰减能否改善整体失真表现?让我们将 THD、SNR 和 SINAD 绘制为输入衰减的函数,从而扫描从 1 dB 到 30 dB 的输入衰减器。
% 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 的幅值对应于无谐波的范围。同样,SNR 对应于不受噪声影响的动态范围;SINAD 对应于没有失真的总动态范围。
从图中可以看出,SNR 随着输入功率衰减的增加而降低。这是因为当您衰减信号时,只有信号在衰减,但放大器的本底噪声保持不变。
还要注意,总谐波失真的幅值会稳步改善,直到它与 SNR 曲线相交,之后测量变得不稳定。当谐波在放大器的噪声下“消失”时,就会出现这种情况。
放大器衰减的一个可行选择项是 26 dB(产生 103 dB 的 SINAD)。这是谐波和噪声失真之间的合理折衷。
% 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 dB 时的周期图。
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 dB 下降到 99 dB,同时保持 131 dB 的原始 SNR。
组合方法
我们可以将衰减与多项式计算相结合,找到最大限度地降低系统整体 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 有显著的改进,而 SNR 不受多项式校正的影响。这在意料之中,因为多项式校正只影响谐波失真,而不影响噪声失真。
让我们显示多项式校正时可能的最大 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(产生 109.8 dB 的 SINAD)。
% 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')
请注意,在理想衰减设置下,通过多项式校正,除了第二个谐波以外的所有谐波都应完全消失。如前所述,第二个谐波出现在总噪声基底功率水平的正下方。这在使用放大器全部带宽的应用中提供了合理的折衷。
总结
我们演示了如何对出现失真的放大器输出应用多项式校正,以及如何选择合理的衰减值来降低谐波失真的影响。
matlab 总谐波失真,分析谐波失真 - MATLAB Simulink Example - MathWorks 中国相关推荐
- 综合评价分析法:熵权法matlab实现+层次分析法matlab实现
综合评价分析法:熵权法matlab实现+层次分析法matlab实现 层次分析法matlab实现 clc;clear%层次分析法matlab实现A=[1 1/9 1/2 1/4 1/6 9 1 6 5 ...
- matlab随机信号分析,基于MATLAB的随机信号分析方法.ppt
<基于MATLAB的随机信号分析方法.ppt>由会员分享,可在线阅读,更多相关<基于MATLAB的随机信号分析方法.ppt(31页珍藏版)>请在人人文库网上搜索. 1.基于MA ...
- 如何用matlab进行工作空间分析,[转载]MATLAB的工作空间输出simulink仿真结果(摘改)...
当我们用Simulink模块计算出系统动态分析结果时,常用示波器(Scope)显示结果.如何将示波器中的波形导出到word中呢?有些人将示波器图标窗口(连同结果)一同复制并且贴到word中,因为示波器 ...
- matlab地震振幅属性分析,洛马普列塔地震分析
- MATLAB Simulink Example
- MathWorks 中国...
加载地震数据 文件 quake.mat 包含圣克鲁斯山脉在 1989 年 10 月 17 日发生的洛马普列塔地震的 200Hz 数据.该数据由加州大学圣克鲁斯分校的 Joel Yellin 通过 Ch ...
- matlab有模糊分析,用matlab进行模糊综合评判_模糊综合评判matlab
用matlab进行模糊综合评判 考虑一个服装评判的问题,为此建立因素集U={u1,u2,u3,u4},其中u1表示花色,u2表示式样,u3表示耐穿程度,u4表示价格,建立评判集V={v1,v2,v3, ...
- matlab 读取mdf文件路径,访问 MDF 文件
- MATLAB Simulink Example
- MathWorks 中国
打开 MDF 文件 通过指定目标文件的名称来打开 MDF 文件.有关该文件的许多基本详细信息已提供.此示例文件是使用 Vector CANape 创建的. m = mdf("CANapeBa ...
- matlab中矩阵重排列,稀疏矩阵重新排序
- MATLAB Simulink Example
- MathWorks 中国
可视化稀疏矩阵 spy 图可以显示矩阵中的非零元素. 下面的 spy 图显示了从杠铃矩阵的一部分得到的稀疏对称正定矩阵.此矩阵描述类似杠铃的图中的连接. load barbellgraph.mat S ...
- 聚类 轮廓 matlab,聚类分析
- MATLAB Simulink Example
- MathWorks 中国
K 均值和层次聚类 Statistics and Machine Learning Toolbox 中的一些函数可执行 K 均值聚类和层次聚类. K 均值聚类是一种分区方法,它将数据中的观测值视为具有 ...
- matlab实现字符识别,字符识别
- MATLAB Simulink Example
- MathWorks 中国
定义问题 脚本 prprob 定义了一个包含 26 列的矩阵 X,每列对应一个字母.每列有 35 个值,值可能是 1,也可能是 0.每列(包含 35 个值)定义一个字母的 5×7 位图. 矩阵 T 是 ...
最新文章
- POJ 2723 Get Luffy Out【二分+2-sat】
- 用计算机连接路由器,用路由器怎么连接两台电脑
- Machine Learning on Spark—— 统计基础(一)
- C++中的STL--基本概念
- python开发小型数据库_python web开发之数据库ORM的 peewee库 动手学习实践笔记
- 工控软件IFIX加入WEB显示图表
- C++基础——函数模板
- GAMMA instabus /products/et/ GAMMA智能楼宇控制系统应用手册
- 提升安全性----用户资金防篡改
- centos网卡配置
- IOS成长之路-使用系统默认声音、震动
- 服务器系统总是蓝屏,Windows 2012R2 服务器频繁蓝屏
- HDU 4417 Super Mario(划分树)
- autoscraper网络刮板模块总结
- Multiplayer Moo
- Hive 中的各种常用set设置
- 聊聊去年最火的前端库zx
- OpenCloudOS开源操作系统社区迎来首个正式版本
- 如何语音翻译成中文?怎么把语音翻译成文字?
- CAD安装1606错误could access network location AutoDesk\AutoCAD2021\R24.0
热门文章
- 使用树莓派连接LED灯
- 2021年最强软件测试工程师Linux面试题及答案
- signature=4746e22a831cd5efc939a83a10a194fc,Title page for ETD etd-07072014-094746
- etcd http API
- 一维中值、均值、高斯滤波的MATLBA实现
- win 下通过dos命令格式化磁盘
- c++之STl容器-string
- 一团乱麻的长租公寓行业,如何通过科技赋能从逆境中突围而出?
- 如何通过RamDisk的方法加速小型数据库的访问速度
- 南农计算机考研真题,2021南京农业大学考研历年真题