Python 功率谱估计直接法

xn=10sin(2pi0.1+pi/3)+4sin(2pi0.4+pi/4),噪声为均值为零方差为一的高斯白噪声,用经典谱估计直接法来估计f1(0.1)和f2(0.4),并计算均方误差(MSE)。

原理

对N点DFT取绝对值后得到幅频特性,取绝对值平方后得到功率谱。
在估计f1、f2时,采取对幅频特性拟合后根据波峰处值最大来得到所要估计的f对应的k。
将整个程序循环多次即可计算估计值的期望和均方误差。
如何调整拟合效果见上篇博文。

结果

功率谱

期望与均方误差

代码

import matplotlib.pyplot as plt
import numpy as np
from math import *
import random as ran
#定义Wn
def WN(N,k,n):
    return complex(cos(-2*pi/N*k*n), sin(-2*pi/N*k*n))
#整个程序循环多次来计算MSE
f_1 = 0
f_2 = 0
Error_f1 = 0
Error_f2 = 0
MSE_f1 = 0
MSE_f2 = 0
times = 5
for time in range(0, int(times)):
    # 设定初始参数
    f1 = 0.1
    f2 = 0.4
    N = 1024
    # 生成空列表存储结果
    Xk = []
    power = []
    #计算DFT和功率谱
    sum = 0
    for k in range(0, N):
        for n in range(0, N):
            xn = 10 * sin(2*pi*f1*n+3/pi)+4*sin(2*pi*f2*n+4/pi)+ran.gauss(0, 1)
            sum += xn * WN(N, k, n)
        Xk.append(sum)
        power.append(sum ** 2)
        sum = 0
    # 画图:频谱、功率谱(实际上为散点图,画为连续曲线)

    plt.title('spectrum map')
    f = [k / N for k in range(0, N)]
    dB_1 = [10*log10(i/N) for i in np.abs(Xk)]
    plt.plot(f, dB_1)
    plt.show()
    plt.title('power spectrum')
    dB_2 = [10*log10(i/N) for i in np.abs(power)]
    plt.plot(f, dB_2)
    plt.show()
    # 取DFT前半部分结果进行拟合
    for i in range(0, int(N / 2)):
        Xk.pop()
    Xk = list(np.abs(Xk))
    x = [i for i in range(0, int(N / 2))]
    y = np.polyfit(x, Xk, 6)
    Xk_smooth = np.polyval(y, x)
    # 对f1、f2进行估计得到对应的k值并存入列表F:波峰处值最大=对于任意的k,X(k)比两侧大即为波峰
    F = []
    for k in range(1, int(N / 2) - 1):
        if Xk_smooth[k] > Xk_smooth[k - 1] and Xk_smooth[k] > Xk_smooth[k + 1]:
            F.append(k)
    # 计算MSE
    f = [k/N for k in F]
    f_1 += f[0]
    f_2 += f[1]
    Error_f1 += (f[0]-f1)**2
    Error_f2 += (f[1]-f2)**2
f_1 = f_1/int(times)
f_2 = f_2/int(times)
print('f_1 = '+str(f_1))
print('f_2 = '+str(f_2))
MSE_f1 = Error_f1/int(times)
MSE_f2 = Error_f2/int(times)
print('MSE_f1 = '+str(MSE_f1))
print('MSE_f2 = '+str(MSE_f2))
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 功率谱估计是一种用于分析信号频域特性的方直接和间接是两种常见的功率谱估计直接是通过对信号进行傅里叶变换直接得到功率谱估计结果。它的优点是计算简单、直观,适用于信号的谱线较为稀疏的情况。但缺点是对于频域中谱线密集的信号会出现分辨率较低的问题,难以准确估计信号的细节。 间接是通过对信号进行自相关或互相关处理来间接估计功率谱。它的优点是对于谱线密集的信号可以提高分辨率和估计精度。但缺点是计算复杂度比较高,需要更多的计算资源,并且对信号的预处理要较高。 误差是指估计得到的功率谱与真实功率谱之间的差异。直接和间接都存在误差问题。对于直接来说,由于谱线的分辨率问题,估计结果可能会模糊或遗漏一些细节。对于间接来说,由于信号的自相关或互相关处理引入了一定的噪声,估计结果可能会有一定的偏差。 为了减小误差,可以采用窗函数对信号进行加窗处理,以提高频域分辨率。同时,选择适当的估计方和对信号进行合理的预处理也是减小误差的关键。在实际应用中,根据具体的需和信号特点,选择合适的功率谱估计和相应的参数,可以提高估计结果的准确性和可靠性。 ### 回答2: 功率谱估计是一种信号处理技术,用于确定信号在不同频率上的功率分布。直接和间接是两种常见的功率谱估计直接是指将信号经过傅里叶变换得到频域的表示,然后通过平方幅度得到信号的功率谱。这种方简单直接,但对噪声敏感,因为噪声也会被平方,并且需要对信号进行零均处理。 间接是指通过自相关函数或协方差函数估计功率谱。自相关函数是信号与其自身在不同时间延迟之间的相关性,协方差函数是两个信号间的相关性。通过这些函数,可以使用Wiener-Khintchine关系将信号的功率谱与自相关函数或协方差函数联系起来。此方对噪声不敏感,但需要计算复杂的自相关函数。 BT误差是指功率谱估计中的偏差-方差折中。偏差是估计与真实之间的平均差异,方差是估计在不同实验中的变化程度。BT误差衡量了估计方的稳定性和准确性。直接通常具有较小的偏差和较大的方差,而间接则相反。在实际应用中,可以根据具体情况选择适合的方,以获得较为准确的功率谱估计结果。 ### 回答3: 功率谱估计是一种对信号频谱分布进行估计的方。在信号处理中,有两种常用的功率谱估计,即直接和间接直接是通过对信号进行傅里叶变换,然后计算幅度平方来估计功率谱直接简单直接,易于理解和实现。但是,它的缺点是需要对整个信号进行傅里叶变换,计算量较大,特别是对于较长的信号来说,计算时间会很长。 间接是通过对信号的自相关函数进行估计来计算功率谱。间接不需要进行全局傅里叶变换,只需要对信号的一小段进行自相关函数的计算即可。间接计算速度快,尤其适用于实时信号处理。然而,间接的估计结果可能存在较大的误差。 误差是指估计功率谱与真实功率谱之间的差异。直接和间接都会引入误差。直接的误差主要来源于对整个信号进行傅里叶变换的近似和计算的舍入误差。间接的误差主要来自于对信号的截断和对自相关函数估计的近似。误差可以通过增加信号采样点数、采用更精确的计算方和降低干扰等方式进行减小。在实际应用中,根据对估计结果精度和计算效率的要,选择合适的估计方和参数设置,以获得较好的功率谱估计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值