东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1348|回复: 1
打印 上一主题 下一主题

[Python] 单频信号的FFT与幅度谱和相位谱(Python)

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14432
QQ
跳转到指定楼层
楼主
发表于 2021-8-26 16:39:26 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式





单频信号的FFT与幅度谱和相位谱(Python)


  1. import numpy as np
  2. from scipy.fftpack import fft, ifft
  3. import matplotlib.pyplot as plt
  4. from matplotlib.font_manager import FontProperties

  5. font = FontProperties(fname="/usr/share/fonts/wps-office/simfang.ttf")

  6. # 单频信号的FFT与幅度谱和相位谱(Python)

  7. # 这里设置采样频率为1400赫兹(即一秒内有1400个采样点,一样意思的)
  8. # 一般实际应用中保证采样频率为信号最高频率的2.56~4倍
  9. fs = 1400
  10. x_time = np.linspace(0, 1, fs, endpoint=True)    # 1是时宽
  11. print("1秒采样了多少个点=", len(x_time))
  12. #  1秒采样多少个点  1400个点  fs=1400
  13. # x_time = np.arange(0, 1, 1/N)

  14. # 设置需要采样的信号,频率分量有200,400和600
  15. f0 = 200
  16. # y = 7 * np.sin(2 * np.pi * 200 * x_time) + 5 * np.sin(2 * np.pi * 400 * x_time) + 3 * np.sin(2 * np.pi * 600 * x_time)
  17. y = 7 * np.cos(2 * np.pi * f0 * x_time)
  18. print("信号周期=%.5f,采样周期=%.5f" % (1/f0, 1/fs))

  19. fft_y = fft(y)  # 快速傅里叶变换
  20. yreal = fft_y.real               # 获取实数部分
  21. yimag = fft_y.imag               # 获取虚数部分

  22. print("快速傅里叶变换后的长度=%d;看看前面的值=" % len(fft_y), fft_y[:5])
  23. # 变换之后的结果数据长度和原始采样信号是一样的
  24. # 每一个变换之后的值是一个复数,为a+bj的形式
  25. # “振幅谱”“相位谱”,它其实就是通过对快速傅里叶变换得到的复数结果进一步求出来的
  26. # FFT得到的复数的模(即abs)就是对应的“幅度谱”,复数所对应的相角,就是所对应的“相位谱”

  27. x_f = np.arange(fs)  # 频率的序列 从0到采样率 频率步进为1
  28. # 实信号是双边频谱
  29. # x_f = np.arange(-fs/2, fs/2, 1)  还不能这样操作

  30. half_x_f = x_f[range(int(fs/2))]  # 取一半  因为 振幅谱 是偶函数 相位谱 是奇函数

  31. abs_y = np.abs(fft_y)  # 取复数的绝对值,即复数的模(双边频谱)
  32. angle_y = np.angle(fft_y)  # 取复数的角度
  33. # 我们发现,振幅谱的纵坐标很大,而且具有对称性
  34. # 关键:关于振幅值很大的解释以及解决办法——归一化和取一半处理
  35. normalization_abs_y = abs_y / fs  # 归一化处理(双边频谱)
  36. normalization_half_abs_y = normalization_abs_y[range(int(fs / 2))]  # 由于对称性,只取前一半区间(单边频谱)

  37. plt.figure(figsize=(16, 12))

  38. plt.subplot(231)
  39. plt.plot(x_time[:20], y[:20], marker='o', markersize=8, markerfacecolor='r')
  40. plt.title('原始采样后波形', fontproperties=font, fontsize=20)
  41. plt.xlabel('time')

  42. plt.subplot(232)
  43. plt.plot(x_f, fft_y, 'black')
  44. plt.title('实信号的双边频谱(两个冲激)', fontproperties=font, fontsize=16)
  45. plt.xlabel('freq')

  46. plt.subplot(233)
  47. plt.plot(x_f, abs_y, 'r')
  48. plt.title('双边幅度谱(未归一化)', fontproperties=font, fontsize=16)
  49. plt.xlabel('freq')

  50. plt.subplot(234)
  51. plt.plot(x_f, angle_y, 'violet')
  52. plt.title('双边相位谱', fontproperties=font, fontsize=16)
  53. plt.xlabel('freq')

  54. plt.subplot(235)
  55. plt.plot(x_f, normalization_abs_y, 'g')
  56. plt.title('双边幅度谱(归一化的)', fontproperties=font, fontsize=16)
  57. plt.xlabel('freq')

  58. plt.subplot(236)
  59. plt.plot(half_x_f, normalization_half_abs_y, 'blue')
  60. plt.title('单边幅度谱(归一化的)', fontproperties=font, fontsize=16)
  61. plt.xlabel('freq')

  62. # plt.savefig('fft.png', dpi=200)
  63. plt.show()
复制代码


单频信号的fft看频谱.png (88.11 KB, 下载次数: 108)

单频信号的fft看频谱.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:30:53 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-25 23:24 , Processed in 0.200778 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表