在Matlab中计算信号功率

计算信号的能量和功率在以前的帖子在这里,我们将使用Matlab中的离散傅里叶变换.点击此处了解更多关于功率和能量的概念.

信号的总功率可以使用以下等式计算

P_x=\显示样式{\lim_{N\rightarrow\infty}\sum_{N=0}^{N-1}|x(N)|^2}\quad\quad(1)

对于其他形式的方程式:请参阅此处。

本文是以下书籍的一部分
使用Matlab进行数字调制:从头开始建立仿真模型,国际标准图书编号:978-1521493885
使用Python的数字调制国际标准图书编号:978-1712321638
Matlab中的无线通信系统国际标准图书编号:979-8648350779
所有书籍都有电子书(PDF)和平装本格式

案例研究:

x(吨)是振幅的正弦波A类和频率(f)c(c)由以下等式表示。

x(t)=A\;sin\left(2\pi f_c t\right)\quad\quad(2)

当在频域中表示时,它看起来像下图右侧的图。这从应用欧拉公式可以数学表示正弦波的事实中可以明显看出。

A\;sin\left(2\pif_ct\right)=显示样式{A\frac{e^{j2\pif _ct}-e^{-j2\ pif _ct}}{2j}}\quad\quad(3)

进行傅里叶变换x(吨)在频域中表示,

\begin{aligned}X(f)&=f\left[A\;sin\left(2\pi f_c t\right)\right]\\&=\int_{-\infty}^{\infty}\left[\frac{e^{j2\pi f_c t}-e^{-j 2\pi f_c t}}{2j}\right]e^{-j 2\pi f t}\\&=\frac{A}{2j}\left[\delta(f-f-c)-\delta(f+c)\right]\end{aligned}\quad\quad(4)

当考虑振幅部分时,上述分解在频域两侧给出了振幅A/2的两个峰值(f)c(c)-(f)c(c).

纯正弦波的时域表示和频谱
图1:纯正弦波的时域表示和频谱

将振幅平方得出单个峰值/频率分量的功率大小。功率谱如下图所示。

纯正弦波的功率谱
图2:纯正弦波的功率谱

因此,如果纯正弦波的振幅A=1V,频率=100Hz,功率谱将有两个峰值A^2/4=0.25 在100 Hz和-100 Hz频率下。总功率为A^2/4+A^2/4=0.25+0.25=0.5瓦

让我们通过仿真来验证这一点。

模拟和验证

实验采用频率为100Hz、幅值为1V的正弦波。

A=1;%正弦波振幅Fc=100;%正弦波频率Fs=1000;%采样率-过采样率为10Ts=1/Fs;%采样周期n周期=200;%正弦波的周期数子区(2,1,1);t=0:Ts:nCycles/Fc-Ts;%时间基准x=A*sin(2*pi*Fc*t);%正弦函数茎(t,x);%Plot命令

这里绘制了10个周期的正弦波

Matlab中产生的正弦波
图3:Matlab中生成的正弦波

Matlab的Norm函数:

Matlab的基本安装附带“规范”功能。Matlab中的p-范数计算如下

NORM(v,p)=\left(显示样式{\sum_{n=0}^{n-1}|x(v)|^p}\right)^{frac{1}{p}}\quad\quad(5)

默认情况下,单参数范数函数计算2-标准给定为

NORM(v)=\left(显示样式{\sum_{n=0}^{n-1}|x(v)|^2}\right)^{frac{1}{2}}\quad\quad(6)

计算信号的总功率x(n)(如上述等式(1)所示),我们所要做的就是计算范数(x),将其平方并除以信号的长度。

L=长度(x);P=(范数(x)^2)/L;sprintf(‘时域信号功率%f’,P);

上述给定的代码段将产生以下输出

时域信号功率0.500000

通过DFT验证总功率:频域

这里,通过对正弦序列应用DFT来验证总功率。正弦序列x(n)在频域中表示X[f]使用Matlab的FFT函数。与每个频率点相关的功率计算如下

P_x[f]=x[f]x^\ast[f]

最后,将总功率计算为频域表示中所有点的总和。

X=快速傅里叶变换(X);Px=总和(X.*conj(X))/(L^2);%通过适当的缩放计算功率。子区(2,1,2)%绘制单面振幅谱。阀杆(Px);sprintf(‘来自DFT的信号总功率%f’,P);

结果:

来自DFT 0.500000的信号总功率
用Matlab模拟纯正弦波的功率谱
图4:Matlab中模拟的纯正弦波功率谱

Matlab FFT上的一句话:如果变换长度为2的幂,则对Matlab的FFT进行优化以获得更快的性能。下面的代码片段只是调用“fft”,而没有转换长度。在这种情况下,窗口长度和变换长度是相同的。这是为了简化功率的计算。您可以重新写入对FFT例程的调用,并将转换长度设置为大于或等于窗口长度(序列长度)的次幂2。那么计算总功率的步骤在分母上会略有不同。但这并不会提高分辨率(记住:计算FFT的零填充不会提高分辨率)。

还要注意,在上面的模拟中,我们使用的是纯正弦曲线。整个正弦序列完全定义了所有周期。序列中没有间断。如果调用FFT时将变换长度设置为2的次幂(如Matlab手册中所示),它将向序列中填充额外的零,并在FFT计算中创建不连续性。这将导致频谱泄漏。这里讨论了FFT和频谱泄漏.

评价此文章: 可怜的低于平均水平平均很好杰出的(17平均票数:3.88(共5个)

参考文献:

[1]Sanjay Lall,“规范和向量空间”,斯坦福大学信息系统实验室。

作者的书籍

Matlab中的无线通信系统
Matlab中的无线通信系统
第二版(PDF)

可怜的低于平均水平平均很好杰出的(178平均票数:3.62(共5个)

使用Python的数字调制
使用Python的数字调制
(PDF电子书)

可怜的低于平均水平平均很好杰出的(131平均票数:3.57(共5个)

数字模块使用matlab图书封面
使用Matlab的数字调制
(PDF电子书)

可怜的低于平均水平平均很好杰出的(135平均票数:3.63(共5个)

人工挑选的通信工程最佳书籍
信号处理最佳书籍

关于“在Matlab中计算信号功率”的15点思考

  1. 你好,西尔;
    我在PM-16QAM和PM-QPSK上的非线性缓解工作。我没有关于我的工作的任何程序,如比特率错误、OSNR、频谱效率等
    如果您有任何信息需要帮助,请联系我们。
    非常感谢

    答复
  2. 为了快速查看我们可以使用的信号的频率响应,
    freqz(sig,1,length(sig),‘whole’)%%给出的频率响应范围为0到2。与按0到2的比例归一化的fft相同。

    答复
  3. 我生成64 QAM pkt,然后将其通过awgn,snr参数设置为10 db,然后生成另一个16 QAM pk,以相同的10 db信噪比通过awgn-问题是当应用范数方法时,对于16和64 QAM的情况,我得到不同的值,所以为什么尽管它们通过相同的10 db信噪比

    答复
    • 此方法计算给定信号的功率。它无法区分信号和噪声。
      信噪比是一个比率。对于您的情况,生成的64-QAM的平均功率可能不同于16-QAM点。即使它们通过相同的信噪比,也会产生成比例的噪声量,使信噪比=10 dB。

      由于信噪比是一个比率,因此64/16 QAM数据包的信号功率和噪声功率可以不同,但保持相同的信噪比。
      因此,将两种情况的信号和噪声功率相加将给出不同的结果。

      答复
    • 如果(ch==0)

      信噪比=10;
      M=64;
      mt=‘64QAM’;
      代码比率=1/2;
      no_samples=.75*fft_size*log2(M)*code_rate;

      sig=randi([01],无样本,1);

      coded_data=卷积(sig,code_rate,10);%matlab中未内置fn的码率3/4

      [x,刻度]=调制(编码数据,mt);%matlab中未内置fn
      pkt64=x*刻度;%用于调制规范化
      info64=awgn(pkt64,snr,‘测量’)
      结束

      如果(ch==1)

      信噪比=10;
      M=16;
      mt=‘16QAM’;
      代码比率=1/2;
      no_samples=.75*fft_size*log2(M)*code_rate;
      sig=randi([01],无样本,1);

      coded_data=卷积(sig,code_rate,10);%matlab中未内置fn的码率3/4

      [x,刻度]=调制(编码数据,mt);%matlab中未内置fn
      pkt16=x*刻度;%用于调制规范化
      info16=awgn(pkt16,snr,‘测量’);
      结束

      u在这里看到,两种情况下的符号pkt16、pkt64都被归一化为1

      答复
      • 不确定什么是调制功能返回到刻度位置。将振幅标准化为单位?
        此外,这两种情况下的no_samples也会不同,因为它取决于M。请使用长数据序列进行尝试。短序列会产生不一致的结果。
        检查FFT和范数方法

        答复
  4. 请给我一个推荐的方法,在matlab中,我可以根据使用的调制方案/顺序盲目估计接收信号的信噪比

    答复
    • 在Matlab中使用L点FFT/IFFT时,它用于正确缩放FFT输出
      X=快速傅里叶变换(X);
      这必须按1/L的因子进行缩放,即序列的长度。

      因此,对于计算能力,即X.*conj(X)(乘以两倍),比例因子为1/(L^2)

      答复
        • 有几个缩放项是可能的。
          1.按dt缩放FFT,按Fs缩放IFFT
          2.按1/M缩放FFT,按M缩放IFFT
          3.将FFT缩放1/sqrt(M),将IFFT缩放m2(M)
          4.将FFT缩放1,将IFFT缩放1
          等。。,

          这里唯一重要的是FFT和IFFT中的缩放项将相乘为一。它还取决于实现中的缩放因子。
          您可以使用各种设置进行测试,并检查哪个因素会给您预期的结果。

          答复

发表您的宝贵意见!!!