我是靠谱客的博主 单薄铃铛,最近开发中收集的这篇文章主要介绍python实现fft应用介绍,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

0.关键几步

注意了 xf 这个是频率, 所以是np.arange(len(y)) 取值为0 ~ 1399

(i-1) /N  *  fs

f = np.arange(N) * fs / N
这个取值就是0~(N-1)
采样点数N ,影响的是分辨率 

如fs = 100 ,N=10 和 N=20分辨率有区别

而 x = np.linspace() 这个是时间,1s钟均匀产生1400个点

x=np.linspace(0,1,1400)
y=7*np.sin(2*np.pi*180*x) + 1.5*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x)

yy=fft(y)      
yf=abs(fft(y))                # 取模
yf1=abs(fft(y))/((len(x)/2))           #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间

xf = np.arange(len(y))        # 频率 ,因为y是1400个点,频率值应该在(i/N)* fs     频率在 1hz 到1400hz之间
xf1 = xf
xf2 = xf[range(int(len(x)/2))]  #取一半区间


plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表
#混合波的FFT(归一化)

plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')


plt.plot(xf2,yf2,'b')
plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')

1.背景知识

1.采样频率:fs
2.采样点数:N
一般来说,1秒钟多少个点,就代表fs

x = np.linspace(0,1,1400)
# 这个的意思就是说  在(0,1)之间,均匀取1400个点
采样频率fs = 1400
x是离散值,但是由于足够小,就视为连续值,可以替代sin(2*pi*w t)
中的t
  1. 有多少个点进行fft变换,就能得到多少个点
    fft 变换的结果是 虚数 a+bj 形式
    N个点 -> N个虚数点
  2. fft的结果 某一点 i 的频率值 就是 (i-1)/N * fs i 从1到N
  3. 模值 / (N / 2) 就是对应频率下的幅值
  4. fft 的结果是具有对称性的,因此只取一半就好,见下图

2.程序

import numpy as np
from scipy.fftpack import fft,ifft
import matplotlib.pyplot as plt
import seaborn

x=np.linspace(0,1,1400)

"""
采样点选择1400个,因为设置的信号频率分量最高为600Hz,
根据采样定理知采样频率要大于信号频率2倍,
所以这里设置采样频率为1400Hz(即一秒内有1400个采样点)
"""

频率有180/390/600三种,叠加起来的
y=7*np.sin(2*np.pi*180*x) + 1.5*np.sin(2*np.pi*390*x)+5.1*np.sin(2*np.pi*600*x)


# x的取值是(0,1) 这就相当于连续的时间点了
plt.figure(dpi=200)
plt.plot(x,y)

在这里插入图片描述

yy=fft(y)           #快速傅里叶变换

yreal = yy.real     # 获取实数部分
yimag = yy.imag     # 获取虚数部分
yy[4]

结果
(0.0015132406744609028-0.16858328525078992j)    # a+bj

abs(yy[4]),fft的结果是一个数,不是array,没必要加np.abs
yf=abs(fft(y))                   # 取模
yf1=abs(fft(y))/((len(x)/2))     #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间
xf = np.arange(len(y))  # 频率 ,因为y是1400个点,频率值应该在(i-1/N)* fs     频率在 1hz 到1400hz之间
xf1 = xf
xf2 = xf[range(int(len(x)/2))]  #取一半区间
#原始波形
plt.figure(dpi=200)

plt.subplot(221)
# 原始波形,就是取50个点看看,没那么密集
plt.plot(x[0:50],y[0:50])
plt.title('Original wave')

#混合波的FFT(双边频率范围)
plt.subplot(222)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表

#混合波的FFT(归一化)
plt.subplot(223)
plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

plt.subplot(224)
plt.plot(xf2,yf2,'b')
plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')


plt.show()

在这里插入图片描述

3.验证一下

假设我们有一个信号,
y=7np.sin(2np.pi180x) + 1.5np.sin(2np.pi390x)+5.1np.sin(2np.pi600x)

从图中我们可以看到,在第181点、第391点、和第601点附近有比较大的值。(181点、391点、601点,代表的频率分别是180hz,390hz,600hz 。 因为初始值为0hz啊 横坐标的单位就是f/hz
分别计算这三个点的模值,结果如下:
181点: 4900
391点:1030
601点:2600
按照公式,可以计算出180Hz信号的幅度为:4900/(N/2)=384/(1400/2)=7;
390Hz信号的幅度为:1030/(N/2)=1030/(1400/2)=1.5。
可见,从频谱分析出来的幅度是正确的。
注:600Hz信号的幅度异常,具体原因为检查出来,后期更新。

4.自己采样的信号

file_name = r'C:UsersWu yuhaoDesktop小论文相关dataleft1.txt'
f = open(file_name)
line = f.readline()
each_line = line.split()
data = []
while each_line:
    b = []
    for x in each_line:
        a = float(x)
        b.append(a)
    data.append(b)
    line = f.readline()
    each_line = line.split()
f.close()
data1 = np.array(data)

d = data1.T[3]
y = d[1400:1600]
plt.plot(y)

在这里插入图片描述

yy = fft(y)

x = np.linspace(0,1,200)

yf=abs(fft(y))                # 取模
yf1=abs(fft(y))/((len(x)/2)) #归一化处理
yf2 = yf1[range(int(len(x)/2))]  #由于对称性,只取一半区间


xf = np.arange(len(y))        # 频率 ,因为y是1400个点,频率值应该在(i/N)* fs     频率在 1hz 到1400hz之间
xf1 = xf
xf2 = xf[range(int(len(x)/2))]  #取一半区间


#原始波形
plt.figure(dpi=200)
plt.subplot(221)
# 原始波形,就是取50个点看看,没那么密集
plt.plot(x[0:50],y[0:50])
plt.title('Original wave')
#混合波的FFT(双边频率范围)
plt.subplot(222)
plt.plot(xf,yf,'r') #显示原始信号的FFT模值
plt.title('FFT of Mixed wave(two sides frequency range)',fontsize=7,color='#7A378B')  #注意这里的颜色可以查询颜色代码表
#混合波的FFT(归一化)
plt.subplot(223)
plt.plot(xf1,yf1,'g')
plt.title('FFT of Mixed wave(normalization)',fontsize=9,color='r')

plt.subplot(224)
plt.plot(xf2,yf2,'b')
plt.title('FFT of Mixed wave)',fontsize=10,color='#F08080')


plt.show()

在这里插入图片描述
图明显是对称了,2-3 和 2-4 取一半分析

5.参考来源

有些是直接copy过来的,
重新总结了一下
,程序重新运行了,自己添加了注释

而且还有自己的数据在这篇博客里,所以就“原创”
博客主要是方便自己看的,没有其他目的,
如果原作者觉得有侵权,联系一下我就是了。。。。
参考来源

最后

以上就是单薄铃铛为你收集整理的python实现fft应用介绍的全部内容,希望文章能够帮你解决python实现fft应用介绍所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(75)

评论列表共有 0 条评论

立即
投稿
返回
顶部