使用pytorch进行FFT和STFT

文章展示了如何使用Python的Numpy库生成一个复合波形,并通过Pytorch进行傅里叶变换和短时傅里叶变换(STFT)。傅里叶变换将信号从时域转换到频域,而STFT则用于分析非平稳信号的时间频率特性。文章通过代码示例解释了这些概念并可视化了结果。
摘要由CSDN通过智能技术生成

首先,我们定义一个波形,幅值分别为20和38,频率为2和13:
y = 20 sin ⁡ ( 2 π × 2 x ) + 38 sin ⁡ ( 2 π × 13 x ) y=20 \sin (2\pi \times 2x)+38\sin (2\pi \times 13x) y=20sin(2π×2x)+38sin(2π×13x)
采样频率为200Hz,采样时间为1s。由于Pytorch中没有类似于Numpy中numpy.pi的用法,所以我们先用Numpy计算函数,然后再存入Tensor。

import torch
import numpy as np
import matplotlib.pyplot as plt

Fs = 200 # Sampling frequency
T = 1 / Fs # period
t = 1 # time
L = Fs * t # signle length

x = np.arange(L)*T
y = 20*np.sin(2*np.pi*2*x) + 38*np.sin(2*np.pi*13*x)

plt.plot(x,y)
plt.xlabel('Time (s)')
plt.ylabel('Amplitude')
plt.show()

波形图如下:
在这里插入图片描述
傅里叶变换是一种将信号从时域转换到频域的数学工具。它将一个连续或离散的信号分解成一系列不同频率的正弦和余弦波的叠加。使用pytorch对该函数进行快速傅里叶变换:

p = torch.fft.fft(torch.from_numpy(y))
p = 2 * torch.abs(p) / len(p)
p = p[:int(len(p) / 2)]
p[0] = 0.
freq_bin = np.arange(int(L/2))*Fs/L

plt.plot(freq_bin,p)
plt.xlabel('Frequency (Hz)')
plt.ylabel('|P1|')
plt.show()

频谱图如下,可以看到幅值和频率与函数y相同:
在这里插入图片描述
下面,我们再对函数进行短时傅里叶变换。短时傅里叶变换(Short-Time Fourier Transform,STFT)是一种信号处理技术,用于将非平稳信号分解成时间和频率的分量。它是傅里叶变换(Fourier Transform)的一种变体,在时间上加一定的窗函数,然后对每个窗函数内的信号进行傅里叶变换,从而得到时频域上的信号特征。STFT常用于音频、图像等信号处理领域,以提取时域和频域上的信息,以及信号的时频分布特性:

spectrum = torch.stft(input=torch.from_numpy(y), n_fft=200, return_complex=True)

此外,还可以用torchaudio.functional.spectrogram,也是返回STFT之后的频谱。

如果想直接画出频谱图可以使用matplotlib的plt.specgram方法:

plt.specgram(y, Fs=Fs)
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.show()

效果如下:
在这里插入图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值