信号生成及DFT的python实现方式

1. 信号生成

在信号处理中,生成特定的信号是很有必要的,下面我们介绍一些常用的信号生成方式:

1.1 正弦信号

正弦信号可以用下面的公式表示:

import numpy as np

import matplotlib.pyplot as plt

# 正弦信号的频率

freq = 2*np.pi/10

# 正弦信号的相位

phase = np.pi/4

# 采样点数为1000

N = 1000

# 生成采样点

t = np.linspace(0, 1, N)

# 生成正弦信号

sig = np.sin(freq*t + phase)

# 显示信号

plt.plot(t, sig)

plt.xlabel('time')

plt.ylabel('signal')

plt.show()

运行上面的代码,会生成一个频率为1Hz,相位为pi/4的正弦信号。如果需要改变频率和相位,只需要修改相应的参数即可。

1.2 方波信号

方波信号可以用下面的代码生成:

# 方波信号的频率

freq = 2*np.pi/10

# 方波信号的周期

period = 2*np.pi/freq

# 采样点数为1000

N = 1000

# 生成采样点

t = np.linspace(0, 1, N)

# 生成方波信号

sig = np.where(np.mod(t, period) < period/2, 1, -1)

# 显示信号

plt.plot(t, sig)

plt.xlabel('time')

plt.ylabel('signal')

plt.show()

运行上面的代码,会生成一个频率为1Hz的方波信号。如果需要改变频率,只需要修改相应的参数即可。

1.3 矩形脉冲信号

矩形脉冲信号可以用下面的代码生成:

# 矩形脉冲信号的宽度

width = 0.1

# 采样点数为1000

N = 1000

# 生成采样点

t = np.linspace(0, 1, N)

# 生成矩形脉冲信号

sig = np.where(np.logical_and(t >= 0.4, t < 0.4+width), 1, 0)

# 显示信号

plt.plot(t, sig)

plt.xlabel('time')

plt.ylabel('signal')

plt.show()

运行上面的代码,会生成一个宽度为0.1s,起始时间为0.4s的矩形脉冲信号。如果需要改变宽度和起始时间,只需要修改相应的参数即可。

2. DFT

DFT(离散傅里叶变换)是一种将时域信号转换为频域信号的方法。下面我们介绍如何使用Python实现DFT。

假设我们有一个长度为N的离散信号x[n],我们可以使用下面的公式计算DFT:

$$X[k]=\sum_{n=0}^{N-1}x[n]e^{-i2\pi kn/N}$$

其中k为频域下标,n为时域下标。我们可以使用下面的代码实现DFT:

# 信号长度

N = 100

# 采样点数为1000

n = np.arange(N)

# 生成长度为N的正弦信号

freq = 1/10

x = np.sin(2*np.pi*freq*n)

# 计算DFT

X = np.zeros(N, dtype=np.complex)

for k in range(N):

for n in range(N):

X[k] += x[n]*np.exp(-2j*np.pi*k*n/N)

# 显示DFT结果

plt.plot(np.abs(X))

plt.xlabel('frequency')

plt.ylabel('|X[k]|')

plt.show()

运行上面的代码,会生成一个频域下标为10的正弦信号。如果需要改变信号的频率,只需要修改相应的参数即可。

2.1 快速傅里叶变换

上面介绍的DFT需要计算N*N次复数乘法,计算复杂度为O(N^2),当N增大时,计算速度会很慢。因此,人们发明了一种更快的计算DFT的方法,称为快速傅里叶变换(FFT)。

Python中,可以使用numpy中的fft函数计算FFT。下面是一个例子:

# 信号长度

N = 100

# 采样点数为1000

n = np.arange(N)

# 生成长度为N的正弦信号

freq = 1/10

x = np.sin(2*np.pi*freq*n)

# 计算FFT

X = np.fft.fft(x)

# 显示FFT结果

plt.plot(np.abs(X))

plt.xlabel('frequency')

plt.ylabel('|X[k]|')

plt.show()

运行上面的代码,会生成和前面一样的结果,但计算速度要快很多。

总结

本文介绍了几种常用的信号生成方法和DFT的Python实现方式。其中, FFT是一种高效的DFT计算方法,可以大大提高计算速度。

后端开发标签