Python——快速傅里叶变换

1.题目 

      给出时域函数,对其采样获得采样数据,并画出对应的x-t曲线;然后对上述采样数据进行傅里叶变换,画出频谱图。运行该程序,需要从键盘输入N中的r值,该程序可以接受的值为5-10的整数。


2.算法及分析

   一般地来说,若具有N个采样点,第L层节点的值为:

    在处理该问题的时候,我们要确定的指数值。对于节点,其p值的可以按照下列方式确定。首先将n用r位二进制形式表示出来,再将改二进制右移r-l位,左边空位补零;然后在将码序倒置,最后再将改二进制写出十进制形式,就确定p值。

    而上式中涉及的两个点为对偶节点。在程序上实现的时候注意对偶节点。


3.程序

import numpy as np
import math as ma
import cmath
import matplotlib.pyplot as plt
def f(t,N):
    x=ma.cos(2*ma.pi/N*t)+0.5*ma.cos(2*2*ma.pi/N*t)+0.8*ma.cos(5*2*ma.pi/N*t)
    return x
r=int(input('输入(5-10)整数'));N=2**r;n=N/2;c=0;nu=0;
t=np.arange(0,N,1);y=np.zeros((N,r));p=np.zeros((N,r))
x=np.zeros((N,1));x1=[]
for i in range(N):
    m=list(bin(i))
    for j in range(len(m)-2):
        y[i,r-1-j]=float(m[len(m)-j-1])
for l in range(1,r+1):
    z=np.zeros((N,r))
    for no in range(r):
        if r-no-1-(r-l)>=0:
            z[:,r-no-1]=y[:,r-no-1-(r-l)]
    for nk in range(N):
        c=0
        for mk in range(r):
            c=c+z[nk,mk]*2**mk
        p[nk,l-1]=c
for nk in range(N):
    x[nk,0]=f(nk,N)
x=x+0j
for j in range(N):
    x1.append(j)
y1=np.array([x1]);
for io in range(1,r+1):
    y1=y1.reshape((2**io,-1))
    b=int(y1.shape[0]/2);l=y1.shape[1];lp=0
    mn=np.zeros((2,int(N/2)))
    for nk in range(l):
        for nl in range(b):
            bg=2*(nl+1)-1
            bv=2*(nl+1)-2
            mn[0,lp]=y1[bv,nk]
            mn[1,lp]=y1[bg,nk]
            lp=lp+1
    a1=np.lexsort(mn[::-1,:])
    mn=mn[:,a1]
    a2=np.lexsort(mn[0:2,:])
    mn=mn[:,a2];nk1=np.zeros((N,1));
    for lop in range(int(N)):
         nk1[lop,0]=x[lop,0]
    for nk in range(int(N/2)):
         pg=[]
         for gg in mn[:,nk]:
            pg.append(gg)
         x[int(pg[0]),0]=nk1[int(pg[0]),0]+cmath.exp(-2*ma.pi*1j/int(N)*p[int(pg[0]),io-1])*nk1[int(pg[1]),0]
         x[int(pg[1]),0]=nk1[int(pg[0]),0]+cmath.exp(-2*ma.pi*1j/int(N)*p[int(pg[1]),io-1])*nk1[int(pg[1]),0]
x=abs(x)
bf=x.reshape(1,-1)
x=np.arange(0,N,1)
x=np.array([x])
y=[];m=0
zk=np.zeros((1,int(N)))
for ba in p[:,-1]:
    zk[0,int(ba)]=bf[0,m]
    m=m+1
for bb in zk:
    for bh in bb:
        y.append(bh)
        for nm in range(100):
            y.append(0)
vf=[]
for nn in x:
    for vvc in nn:
        vf.append(vvc)
        for llk in range(100):
            vf.append(vvc+llk*0.01)
plt.plot(vf,y)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.xlabel('K值')
plt.ylabel('频谱幅度')
plt.title('FFT频域')
plt.show()
mk=[];po=[]
for bg in range(int(N)+1):
    mk.append(f(bg,N))
    po.append(bg)
mk1=[];pno=[]
for bg2 in range(0,int(N)*25):
    mk1.append(f(bg2,N))
    pno.append(bg2)
plt.plot(pno,mk1)
plt.scatter(po,mk)
plt.ylabel('x')
plt.xlabel('t')
plt.title('FFT时域')
plt.show()
plt.scatter(po,mk)
plt.plot(po,mk)
plt.ylabel('x')
plt.xlabel('t')
plt.title('FFT时域采样点')
plt.show()

4.结果

(1)r=5


(2)r=7


5.实验总结

    (1)从程序的结果来看,我们可以用有限的频谱空间来表征比较复杂的时域空间,可以将问题大大的简化;

    (2)本次程序使用的方法为FFT方法,它的优势很明显,就是快速。从多次的乘法和加法变为几次的乘法和简单的加减法,可以大大的减少计算量;

    (3)本次程序的编程难点:1.确定p的值2.确定对偶节点;本次程序较为优势的时候,可以输出所有P点以及每层的对偶节点。相对来说更容易展示程序的正确性。

                                            

  • 1
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python脑电快速傅里变换是一种用于分析脑电信号频谱的方法。脑电快速傅里变换Python信号处理模块中的一个功能,它通过将时域上的脑电信号转换为频域上的频谱图来实现。这个功能可以通过使用Python中的信号处理模块来实现,例如中提到的具有傅里变换函数的模块。 在脑电信号处理中,快速傅里变换可以用于将时域上的脑电信号转换为频域上的频谱,从而分析脑电信号在不同频率范围内的能量分布。这对于研究脑电信号的频率特征和频谱分布非常有用。通过使用Python的信号处理模块进行脑电快速傅里变换,我们可以获取脑电信号在不同频率上的能量分布情况,进而进行进一步的分析和处理。 总之,Python脑电快速傅里变换是一种用于分析脑电信号频谱的方法,可以通过使用Python的信号处理模块中的傅里变换函数来实现。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Python 信号处理——傅里变换](https://blog.csdn.net/m0_37262671/article/details/125284215)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [pyeeg安装包.zip](https://download.csdn.net/download/qq_45874683/32615149)[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^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eyu.sir

谢谢。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值