python的傅里叶变换,python傅里叶分解

  python的傅里叶变换,python傅里叶分解

  傅立叶变换

  法国科学家傅立叶提出,任何周期曲线,无论多么跳跃或不规则,都可以表示为一组光滑正弦曲线的叠加和。傅立叶变换是将不规则曲线分解成一组平滑正弦曲线的过程。

  傅里叶变换的目的是将时域(即时域)的信号变换成频域(即频域)的信号。随着领域的转换,理解同一事物的角度也会发生变化。因此,时域中的一些难点可以在频域中简单处理。这可以大大减少处理信号存储量。

  例如,弹钢琴

  假设有一个时域函数:y=f(x)。根据傅立叶的理论,它可以分解为一系列正弦函数的叠加。它们的振幅A、频率或初始相位是不同的:

  $ $ y=A _ 1 sin(\ omega _ 1x \ phi _ 1)A _ 2 sin(\ omega _ 2x \ phi _ 2)A _ 2 sin(\ omega _ 2x \ phi _ 2)R $ $

  所以傅里叶变换可以把一个复杂的函数转化为几个简单函数的叠加,看问题的视角也从时域转移到频域,所以有些问题会更容易处理。

  傅立叶变换相关函数

  S=NP。FFT。FFT freq(样本数,采样周期)傅里叶变换分解后的阵列的频率序列是通过样本数和采样周期得到的。

  Np.fft.fft.fft(原始序列)对原始函数值序列进行快速傅立叶变换,得到复数组。复数的模代表振幅,复数的振幅代表初始相位。

  对np.fft.fft.ifft(复数序列)的复数阵列进行逆傅立叶变换,以获得函数值的合成阵列。

  案例:通过对合成波进行快速傅里叶变换,得到分解波阵的频率、振幅和初相阵列,并绘制频域图像。

  import numpy as npimportmatplotlib . py plot as pltimportnumpy . FFT as FFT

  x=np.linspace(-2 * np.pi,2 * np.pi,1000)

  n=1000y=np.zeros(x.size)对于范围(1,n-1)中的I:

  y=4 * NP . pi/(2 * I-1)* NP . sin((2 * I-1)* x)

  complex _ array=FFT . FFT(y)print(complex _ array . shape)#(1000,)

  print(complex _ array . dtype)# complex 128

  print(complex _ array[0])#(-2.1458390619955026 e-12 0j)

  y_new=fft.ifft(复数_数组)

  plt.subplot(311)

  plt.grid(linestyle=:)

  Plt.plot(x,y,label=y) #y是1000个和的正弦序列。

  plt.subplot(312)

  Plt.plot (x,y _ new,label= y _ new ,color= orange) # y是ifft变换后的序列。

  #获得分解波的频率序列

  S=FFT。FFT freq (x.size,x [1]-x [0]) #复数的模就是信号的幅度(能量)。

  complex_array=fft.fft(y)

  pows=np.abs(复杂阵列)

  plt.subplot(313)

  plt.title(频域,fontsize=16)

  plt.xlabel(频率,fontsize=12)

  plt.ylabel(Power ,fontsize=12)

  plt.tick_params(labelsize=10)

  plt.grid(linestyle=:)

  plt.plot(频率[频率0],功率[频率0],c=橙色,标签=频率)

  plt .图例()

  plt.tight_layout()

  plt.show()

  基于傅里叶变换的频域滤波

  含噪信号是高能信号和低能噪声的叠加,可以通过傅里叶变换的频域滤波来降低。

  通过FFT将带噪信号转换成带噪频谱,去除低能噪声,留下高能频谱,再由IFFT留下高能信号。

  案例:基于傅里叶变换的频域滤波去除音频文件中的噪声(noiseed.wav数据集地址)。

  1.读取音频文件,获取音频文件的基本信息:样本数、采样周期、每个样本的声音信号值。绘图:音频时域的时间/位移图像

  将numpy作为npimportnumpy.fft作为nfimportscipy.io.wav文件作为wfimportmatplotlib.pyplot作为PLT #读取音频文件

  Sample _ rate,noisy _ sigs=wf.read(。/da _ data/noise . wav )print(sample _ rate)# sample _ rate:采样率为44100。

  print(noise _ sigs . shape)# noise _ sigs:存储音频中每个采样点的采样位移(220500,)

  times=NP . arange(noised _ sigs . size)/sample _ rate

  plt.figure(“过滤器”)

  plt.subplot(221)

  plt.title(时间域,fontsize=16)

  plt.ylabel(Signal ,fontsize=12)

  plt.tick_params(labelsize=10)

  plt.grid(linestyle=:)

  plt.plot(times[:178],noised_sigs[:178],c= orangered ,label=Noised )

  plt .图例()

  2、基于傅里叶变换,获取音频频域信息,绘制音频频域的:频率/能量图像

  #傅里叶变换后,绘制频域图像

  freqs=nf.fftfreq(times.size,times[1] -times[0])

  复杂数组=nf。FFT(噪声信号)

  pows=np.abs(复杂阵列)

  plt.subplot(222)

  plt.title(频域,fontsize=16)

  plt.ylabel(Power ,fontsize=12)

  plt.tick_params(labelsize=10)

  plt.grid(linestyle=:)#指数增长坐标画图

  plt.semilogy(频率[频率0],功率[频率0],c=limegreen ,标签=噪声)

  plt。图例()

  3、将低频噪声去除后绘制音频频域的:频率/能量图像

  #寻找能量最大的频率值

  fund _ freq=freqs[pows。arg max()]#其中函数寻找那些需要抹掉的复数的索引

  noised _ indexes=NP。哪里(freqs!=fund_freq)#复制一个复数数组的副本,避免污染原始数据

  filter _ complex _ array=复杂阵列。复制()

  filter _ complex _ array[noised _ indexes]=0

  filter_pows=np.abs(过滤器_复合体_阵列)

  plt.subplot(224)

  plt.xlabel(频率,fontsize=12)

  plt.ylabel(Power ,fontsize=12)

  plt.tick_params(labelsize=10)

  plt.grid(linestyle=:)

  plt.plot(频率[频率=0],过滤器_粉末[频率=0],c=道奇blue ,label=Filter )

  plt。图例()

  4、基于逆向傅里叶变换,生成新的音频信号,绘制音频时域的:时间/位移图像

  过滤器_信号=nf。IFFT(过滤器_复杂_阵列).真实的

  plt.subplot(223)

  plt.xlabel(Time ,fontsize=12)

  plt.ylabel(Signal ,fontsize=12)

  plt.tick_params(labelsize=10)

  plt.grid(linestyle=:)

  plt.plot(times[:178],filter_sigs[:178],c=hotpink ,label=Filter )

  plt。图例()

  5、重新生成音频文件

  #生成音频文件

  wf.write(./da_data/filter.wav ,sample_rate,filter_sigs)

  plt.show()

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: