用Python实现小波变换和傅里叶变换消除白噪声

用Python实现小波变换和傅里叶变换消除白噪声

算法原理
(1)小波变换
在这里插入图片描述
在这里插入图片描述
(2)傅里叶变换
DFT的正变换计算公式为:
在这里插入图片描述
DFT的逆变换计算公式为:
在这里插入图片描述
指数部分根据 Euler公式计算:
在这里插入图片描述

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 18 16:16:28 2020
@author: 侯明会
"""
import math
import matplotlib.pyplot as plt
N=128
data=[0]*N
#在文件中读取128个数据
fo=open("lorenza.dat","r+")
list_x=list(fo.read().splitlines(False))
fo.close()
for i in range(N):
    data[i]=float(list_x[i])

#小波变换
def DWT():
    k=3   #k值设为3
    A=[[]]*k
    D=[[]]*k
    print("数据图为:")
    plt.plot(data)
    plt.axis([0,128,0,25])
    plt.show()
    #小波分解
    for i in range(int(N/2)):
        A[0]=A[0]+[(data[2*i]+data[2*i+1])/math.sqrt(2)]
        D[0]=D[0]+[(data[2*i]-data[2*i+1])/math.sqrt(2)]
    n=N/2
    for j in range(1,k):
        for i in range(int(n/2)):
            A[j]=A[j]+[(A[j-1][2*i]+A[j-1][2*i+1])/math.sqrt(2)]
            D[j]=D[j]+[(A[j-1][2*i]-A[j-1][2*i+1])/math.sqrt(2)]
        n=n/2
    DWT_x=A[j]
    for i in range(k):
        DWT_x=DWT_x+D[i]
    print("分解图为:")
    plt.plot(DWT_x)
    plt.axis([0,128,-4,60])
    plt.show()
    #滤波
    Deltaw=10
    for i in range(N):
        if DWT_x[i]<Deltaw:#把DWT_x中小于Deltaw的数值归零
            DWT_x[i]=0
    print("滤波后图为(Deltaw=10):")
    plt.plot(DWT_x)
    plt.axis([0,128,-4,60])
    plt.show()
    #逆变换
    for i in range(len(A[j])):#把A[j]中小于Deltaw的数值归零
        if A[j][i]<Deltaw:
            A[j][i]=0
    for i in range(k):
        for l in range(len(D[i])):#把D[k]中小于Deltaw的数值归零
            if D[i][l]<Deltaw:
                D[i][l]=0
    for m in range(k-1,-1,-1):
        for i in range(len(A[m])):
            if m-1>-1:
                A[m-1][2*i]=(A[m][i]+D[m][i])/math.sqrt(2)
                A[m-1][2*i+1]=(A[m][i]-D[m][i])/math.sqrt(2)
    for i in range(len(A[1])):
        A[0][2*i]=(A[1][i]+D[1][i])/math.sqrt(2)
        A[0][2*i+1]=(A[1][i]-D[1][i])/math.sqrt(2)
    new_data=[0]*N
    for i in range(len(A[0])):
        new_data[2*i]=(A[0][i]+D[0][i])/math.sqrt(2)
        new_data[2*i+1]=(A[0][i]-D[0][i])/math.sqrt(2)
    print("逆变换后图为:")
    plt.plot(new_data)
    plt.axis([0,128,0,25])
    plt.show()
    return

#傅里叶变换
def DFT():
    X=[0]*N
    FF=[]
    print("数据图为:")
    plt.plot(data)
    plt.axis([0,128,0,25])
    plt.show()
    for k in range(N):
        F=[[],[]]#一个存实数 一个存虚数
        for i in range(N):
            a=-k*i*2*math.pi/N
            F[0]=F[0]+[math.cos(a)*data[i]]
            F[1]=F[1]+[math.sin(a)*data[i]]
        f1=f2=0
        for j in range(N):
            f1=f1+F[0][j]
            f2=f2+F[1][j]
        FF.append([f1,f2])
        X[k]=math.sqrt(f1**2+f2**2)
    print("正变换后图为:")
    plt.plot(X)
    plt.show()
    #滤波
    Deltaf = 100
    for k in range(N):
        if X[k]<Deltaf:#把X中小于Deltaf的数值归零
            X[k]=0
            FF[k]=[0,0]
    print("滤波后图为(Deltaf = 100):")
    plt.plot(X)
    plt.show()
    #逆变换
    X1=[0]*N
    for n in range(N):
        F1=[[],[]]#一个存实数 一个存虚数
        for i in range(N):
            a=n*i*2*math.pi/N
            F1[0]=F1[0]+[(FF[i][0]*math.cos(a)-FF[i][1]*math.sin(a))/N]
            F1[1]=F1[1]+[(FF[i][1]*math.cos(a)+FF[i][0]*math.sin(a))/N]
        f11=f12=0
        for j in range(N):
            f11=f11+F1[0][j]
            f12=f12+F1[1][j]
        X1[n]=math.sqrt(f11**2+f12**2)
    print("逆变换后图为:")
    plt.plot(X1)
    plt.axis([0,128,0,25])
    plt.show()
    return
print("小波变换过程图如下:")
DWT()
print("傅里叶变换过程图如下:")
DFT()
           

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
变换傅里变换都是用于信号分析和处理的数学工具。然而,它们在处理非平稳信号方面存在着不同的局限性和优势。 傅里变换通过将信号分解为一系列正弦和余弦的频域表示来分析信号的频谱特性。它适用于处理平稳信号,即信号的频谱特性不随时间变化。傅里变换提供了信号的频率信息,但却无法提供信号在时间上的局部化信息。因此,对于非平稳信号,傅里变换存在局限性。 小变换是一种基于时频域分析的方法,它使用一组称为小基函数的有限长度形来分析信号。小基函数具有时域上的局部化特性,可以在时间和频率上同时提供精确的信息。小变换允许我们同时观察信号的时域和频域特性,因此对于非平稳信号的分析更加适用。小变换可以得到一个时频谱,使得我们能够同时获得信号的时间和频率信息。 综上所述,小变换相比于傅里变换在处理非平稳信号方面具有更大的优势。小变换能够提供更详细的时频信息,因此在许多领域,如图像处理和信号处理中广泛应用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [频域处理:傅里变换及小变换](https://blog.csdn.net/fb_941219/article/details/83473327)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [小变换](https://blog.csdn.net/weixin_33722405/article/details/93172267)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值