首先,我们定义一个波形,幅值分别为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
方法:文章来源:https://www.toymoban.com/news/detail-478806.html
plt.specgram(y, Fs=Fs)
plt.xlabel('Time (s)')
plt.ylabel('Frequency (Hz)')
plt.show()
效果如下:
文章来源地址https://www.toymoban.com/news/detail-478806.html
到了这里,关于使用pytorch进行FFT和STFT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!