频谱分析:基于python画出时域频域波形

3 篇文章 1 订阅

一,FFT解释

FFT(Fast Fourier Transformation)是离散傅氏变换(DFT)的快速算法。即为快速傅氏变换。它是根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。

二、基于python画出时域频域波形

1.python代码

依据快速傅里叶算法得到信号的频域,将其各个频率分量的幅值绘制成图。为便于计算,我们将采样频率8000次近似设为8192次
正弦波表达式为: s(t) = 0.6 sin( 2π 50t ) 和s(t) = 0.6 sin( 2π 500t )

import numpy as np#导入一个数据处理模块

import matplotlib.pyplot as plt#导入一个绘图模块

# 依据快速傅里叶算法得到信号的频域
def test_fft():
    sampling_rate = 8192  # 采样率
    fft_size = 8192  # FFT取样长度
    t = np.arange(0, 8.192, 1.0 / sampling_rate)
    #np.arange(起点,终点,间隔)产生8.192s长的取样时间
    x=0.6*np.sin(2*np.pi*500*t)+0.6*np.sin(2*np.pi*50*t)
    # 两个正弦波叠加,500HZ和50HZ
    # N点FFT进行精确频谱分析的要求是N个取样点包含整数个取样对象的波形。
    # 因此N点FFT能够完美计算频谱对取样对象的要求是n*Fs/N(n*采样频率/FFT长度),
    # 因此对8KHZ和512点而言,完美采样对象的周期最小要求是8000/512=15.625HZ,
    # 所以156.25的n为10,234.375的n为15。

    xs = x[:fft_size]# 从波形数据中取样fft_size个点进行运算

    xf = np.fft.rfft(xs) / fft_size  # 返回fft_size/2+1 个频率
    #利用np.fft.rfft()进行FFT计算,rfft()是为了更方便对实数信号进行变换,
    # 由公式可知 / fft_size为了正确显示波形能量
    # rfft函数的返回值是N/2+1个复数,分别表示从0(Hz)到sampling_rate/2(Hz)的分。

    # 于是可以通过下面的np.linspace计算出返回值中每个下标对应的真正的频率:
    freqs = np.linspace(0, sampling_rate*10, fft_size/2+1 )  # 表示频率
    #freqs = np.linspace(0, sampling_rate/2 , fft_size/2  + 1)  # 表示频率

    xfp = 20 * np.log10(np.clip(np.abs(xf), 1e-20, 1e100))
    #xfp = np.abs(xf) * 2  # 代表信号的幅值,即振幅
    # 最后我们计算每个频率分量的幅值,并通过 20*np.log10()将其转换为以db单位的值。
    # 为了防止0幅值的成分造成log10无法计算,我们调用np.clip对xf的幅值进行上下限处理

    plt.figure(figsize=(8, 4))
    plt.subplot(211)
    plt.plot(t[:fft_size], xs)
    plt.xlabel(u"时间(秒)", fontproperties='FangSong')
    plt.title(u"500Hz和50Hz的波形和频谱", fontproperties='FangSong')

    plt.subplot(212)
    plt.plot(freqs, xfp)
    plt.xlabel(u"频率(Hz)", fontproperties='FangSong')
    #字体FangSong
    plt.ylabel(u'幅值', fontproperties='FangSong')
    plt.subplots_adjust(hspace=0.4)
    '''subplots_adjust(left=None, bottom=None, right=None, top=None, wspace=None, hspace=None)
    有六个可选参数来控制子图布局。值均为0~1之间。其中left、bottom、right、top围成的区域就是子图的区域。
    wspace、hspace分别表示子图之间左右、上下的间距。实际的默认值由matplotlibrc文件控制的。
    '''
    plt.show()



test_fft()
2.结果显示

在这里插入图片描述

  • 13
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
Python中,时频分析是一种用于分析信号在时间和频率上的变化的方法。时频分析可以帮助我们了解信号的频率成分随时间的变化情况。 通过使用NumPy和Matplotlib库,我们可以在Python中进行时频分析。其中,引用展示了绘制频率不断变化的正弦波的方法。通过定义频率数组和时间数组,我们可以计算出正弦波的值,并使用Matplotlib库将其绘制出来。 引用展示了绘制频率和振幅变化的正弦波的方法。通过设置振幅数组和频率数组,我们可以将时间分块,并在每个时间块内计算出正弦波的值。最后,使用Matplotlib库将这些正弦波绘制出来。 引用展示了绘制振幅不断变化的正弦波的方法。通过定义振幅数组和时间数组,我们可以计算出振幅变化的正弦波的值,并使用Matplotlib库将其绘制出来。 这些方法可以帮助我们对信号在时间和频率上的变化进行可视化分析,从而更好地理解信号的特性和变化趋势。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [使用Python作时频分析-1](https://blog.csdn.net/zhangyong6712/article/details/129937697)[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: 100%"] [ .reference_list ]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

唐维康

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值