离散度计算公式 python_使用python实现离散时间傅里叶变换的方法

这篇文章详细介绍了如何使用Python进行离散时间傅里叶变换的实践,包括基本原理、奈奎斯特采样定律、步骤演示和快速傅里叶变换的比较。通过实例展示了如何计算信号频谱并处理幅值,适合学习信号处理和编程者参考。
摘要由CSDN通过智能技术生成

我们经常使用傅里叶变换来计算数字信号的频谱,进而分析数字信号,离散时间傅里叶变换的公式为:

20199284232565.png?2019828434

可是自己动手实现一遍才是最好的学习。

在数字分析里面,傅里叶变换默认等时间间隔采样,不需要时间序列,只需要信号数组即可分析。

分析过程如下:

对于含有 n 个样本值的数字信号序列,根据奈奎斯特采样定律,包含的周期数最大为 n/2,周期数为 0 代表直流分量。所以,当周期数表示为离散的 0,1,2,3…n/2 ,总的数目为 n/2+1个

傅里叶变换之后的结果为复数, 下标为 k 的复数 a+b*j 表示时域信号中周期为 N/k 个取样值的正弦波和余弦波的成分的多少, 其中 a 表示 cos 波形的成分, b 表示 sin 波形的成分

首先产生一个长度为 n,一倍周期的 $e^{-jwn} $ (即为 $cos(wn)-jsin(wn) $ )波样本序列.

将数字信号序列中的每一个样本与 1 倍周期的样本波形序列相乘,得到 n 个乘积,将 n 个乘积相加,放入 f[1] 中。

再产生一个长度为 n,两倍周期的 $e^{-jwn} $ (即为 $cos(wn)-jsin(wn) $ )波样本序列,再将数字信号序列中的每一个样本与 2 倍周期的样本波形序列相乘,得到 n 个乘积,将 n 个乘积相加,放入 f[2] 中。依次重复。

对于 0 倍周期,即直流分量来说,可以认为产生的是 0 倍周期的样本波形,重复操作,放入 f[0] 即可。

这样就得到了数字信号序列的傅里叶变换

使用方法:

从以上过程得到数字序列的傅里叶变换之后,如果想要得到真正频谱,还需要做处理:

计算出的每一个频率下的幅值需要除以时间序列的长度,类似求平均的过程

每一个频率下的幅值是一个复数,需要对它求模,而且因为在负频率处也有值,所以需要对于实信号需要乘 2

频率的序列为 0 到采样率的一半,长度为 n/2+1

完整程序:

# 离散时间傅里叶变换的 python 实现

import numpy as np

import math

import pylab as pl

import scipy.signal as signal

import matplotlib.pyplot as plt

sampling_rate=1000

t1=np.arange(0, 10.0, 1.0/sampling_rate)

x1 =np.sin(15*np.pi*t1)

# 傅里叶变换

def fft1(xx):

# t=np.arange(0, s)

t=np.linspace(0, 1.0, len(xx))

f = np.arange(len(xx)/2+1, dtype=complex)

for index in range(len(f)):

f[index]=complex(np.sum(np.cos(2*np.pi*index*t)*xx), -np.sum(np.sin(2*np.pi*index*t)*xx))

return f

# len(x1)

xf=fft1(x1)/len(x1)

freqs = np.linspace(0, sampling_rate/2, len(x1)/2+1)

plt.figure(figsize=(16,4))

plt.plot(freqs,2*np.abs(xf),'r--')

plt.xlabel("Frequency(Hz)")

plt.ylabel("Amplitude($m$)")

plt.title("Amplitude-Frequency curve")

plt.show()

201909020825324.jpg

plt.figure(figsize=(16,4))

plt.plot(freqs,2*np.abs(xf),'r--')

plt.xlabel("Frequency(Hz)")

plt.ylabel("Amplitude($m$)")

plt.title("Amplitude-Frequency curve")

plt.xlim(0,20)

plt.show()

201909020825325.jpg

此处实现的是传统的傅里叶变换,这种方法实际已经不用了,现在使用快速傅里叶变换,其实两种是等价的,但是快速傅里叶变换时间复杂度要小很多。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值