请用python写一个快速傅里叶变换代码
时间: 2024-02-01 22:02:30 浏览: 76
以下是简单的python快速傅里叶变换代码:
```python
import numpy as np
def fft(x):
"""快速傅里叶变换"""
N = x.shape[0]
if N == 1:
return x
even = fft(x[::2])
odd = fft(x[1::2])
T = [np.exp(-2j*np.pi*k/N)*odd[k] for k in range(N//2)]
return np.array([even[k] + T[k] for k in range(N//2)] + [even[k] - T[k] for k in range(N//2)])
# 测试
x = np.array([1, 2, 3, 4])
print(fft(x)) # 输出 [10. -2.+2.82842712j -2. -0.j -2.-2.82842712j]
```
当然,这只是一个简单的示例,实际上,有现成的库函数可以直接进行快速傅里叶变换,比如`numpy.fft`模块中的`fft`函数。
相关问题
请用python写一个傅里叶变换的例子
好的,我可以为你提供一个简单的 Python 代码示例,用于执行傅里叶变换和频谱分析。在这个例子中,我们将使用 NumPy 和 Matplotlib 库来实现。
```python
import numpy as np
import matplotlib.pyplot as plt
# 设置采样频率、采样时间、采样点数
fs = 1000
t = np.arange(0, 1, 1/fs)
N = len(t)
# 创建信号
f1 = 50
f2 = 120
x = 0.7*np.sin(2*np.pi*f1*t) + np.sin(2*np.pi*f2*t)
# 进行傅里叶变换
X = np.fft.fft(x)
# 计算频谱
freqs = np.fft.fftfreq(N, 1/fs)
idx = np.argsort(freqs)
freqs = freqs[idx]
X = X[idx]
psd = np.abs(X)**2/N
# 绘制原始信号和频谱
fig, ax = plt.subplots(2, 1)
ax[0].plot(t, x)
ax[0].set_xlabel('Time [s]')
ax[0].set_ylabel('Amplitude')
ax[0].grid(True)
ax[1].plot(freqs, psd)
ax[1].set_xlabel('Frequency [Hz]')
ax[1].set_ylabel('Power Spectral Density')
ax[1].grid(True)
plt.show()
```
这个例子中,我们首先设置了采样频率、采样时间和采样点数,然后创建了一个复杂的信号,包含两个正弦波。接着,我们使用 NumPy 库的 `fft()` 函数执行傅里叶变换,并使用 `fftfreq()` 函数计算频率。最后,我们绘制了原始信号和频谱图,以便观察信号的频率成分。
用python写一个傅里叶变换
傅里叶变换是一种信号处理技术,可以将时域上的信号转换为频域上的信号,常用于音频、图像等领域。在Python中,可以使用NumPy库实现傅里叶变换。
下面是一个简单的示例代码,可以实现对一维信号的傅里叶变换和逆变换:
```python
import numpy as np
import matplotlib.pyplot as plt
# 定义信号
t = np.linspace(-1, 1, 500)
f = np.sin(2 * np.pi * 5 * t) + np.sin(2 * np.pi * 10 * t)
# 进行傅里叶变换
F = np.fft.fft(f)
# 计算频率轴
freqs = np.fft.fftfreq(len(t))
freqs *= 1 / (t[1] - t[0])
# 绘制原始信号和频率域图像
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6))
ax1.plot(t, f)
ax1.set_xlabel('Time')
ax1.set_ylabel('Amplitude')
ax2.plot(freqs, np.abs(F))
ax2.set_xlim(-20, 20)
ax2.set_xlabel('Frequency')
ax2.set_ylabel('Amplitude')
# 进行逆变换
f_restored = np.fft.ifft(F)
# 绘制逆变换后的信号
fig, ax = plt.subplots(figsize=(8, 4))
ax.plot(t, f, label='Original')
ax.plot(t, f_restored, label='Restored')
ax.legend()
ax.set_xlabel('Time')
ax.set_ylabel('Amplitude')
plt.show()
```
代码中首先定义了一个信号,这里是两个正弦波的和。然后使用`np.fft.fft`函数进行傅里叶变换,得到频域上的信号。使用`np.fft.fftfreq`函数计算频率轴,方便后续绘图。然后绘制原始信号和频率域图像。
接着使用`np.fft.ifft`函数进行逆变换,得到原始信号的近似值。最后绘制逆变换后的信号,可以看到近似程度还是比较高的。
需要注意的是,傅里叶变换和逆变换的结果都是复数,因此需要使用`np.abs`函数取绝对值得到幅度谱。另外,由于傅里叶变换是对无穷长信号的处理,因此在实际应用中需要对信号进行截断或补零处理,以保证计算的准确性。
阅读全文