http://
blog.csdn.net/pipisorry/article/details/51050297
快速傅里叶变换
NumPy中,fft模块提供了快速傅里叶变换的功能。在这个模块中,许多函数都是成对存在的,也就是说许多函数存在对应的逆操作函数。例如,fft和ifft函数就是其中的一对。
import numpy as np
from matplotlib.pyplot import plot, show
x = np.linspace(0, 2 * np.pi, 30) #创建一个包含30个点的余弦波信号
wave = np.cos(x)
transformed = np.fft.fft(wave) #使用fft函数对余弦波信号进行傅里叶变换。
print np.all(np.abs(np.fft.ifft(transformed) - wave) < 10 ** -9) #对变换后的结果应用ifft函数,应该可以近似地还原初始信号。
plot(transformed) #使用Matplotlib绘制变换后的信号。
show()
移频
numpy.fft模块中的fftshift函数可以将FFT输出中的直流分量移动到频谱的中央。ifftshift函数则是其逆操作。
import numpy as np
from matplotlib.pyplot import plot, show
x = np.linspace(0, 2 * np.pi, 30)
wave = np.cos(x) #创建一个包含30个点的余弦波信号。
transformed = np.fft.fft(wave) #使用fft函数对余弦波信号进行傅里叶变换。
shifted = np.fft.fftshift(transformed) #使用fftshift函数进行移频操作。
print np.all((np.fft.ifftshift(shifted) - transformed) < 10 ** -9) #用ifftshift函数进行逆操作,这将还原移频操作前的信号。
plot(transformed, lw=2)
plot(shifted, lw=3)
show() #使用Matplotlib分别绘制变换和移频处理后的信号。
from:
http://blog.csdn.net/pipisorry/article/details/51050297
http://blog.csdn.net/pipisorry/article/details/51050297快速傅里叶变换NumPy中,fft模块提供了快速傅里叶变换的功能。在这个模块中,许多函数都是成对存在的,也就是说许多函数存在对应的逆操作函数。例如,fft和ifft函数就是其中的一对。import numpy as npfrom matplotlib.pyplot
import matplotlib.pyplot as plt
import seaborn
#采样点选择1400个,因为设置的信号频率分量最高为600赫兹,根据采样定理知采样频率要大于信号频率2倍,所以这里设置采样频率为1400赫兹(即一秒内有1400个采样点,一样意思的)
x=np.linspace(0,1,1400)
说明:本文适合信号处理方面有一定的基础的人阅读,能够理解什么时候傅里叶级数和傅里叶变换,能够理解他们的核心思想以及基本原理,能够理解到底什么是“频率域”,能够从频率的角度分析信号。
一、一些关键概念的引入
1、离散傅里叶变换(DFT)
离散傅里叶变换(discrete Fourier transform) 傅里叶分析方法是信号分析的最基本方法,傅里叶变换是傅里叶分析的核心,通过它把信...
numpy
下
fft
模块
提供了丰富的
fft
函数,几种常用的在这里记录一下使用方式
输入实数samples,如果输入的sample是带虚数部分的话,虚数部分会被默认删除。
t=np.arange(12)
b=np.sin(t)
print(b)
print("sum(b)=", np.sum(b))
s = np.
fft
.
fft
(b)
print(s)
运行结果截图如下
从图中可以看到,
[0]是一个实数,实数部分是所有input中各个元素之和。
[i]与[N-i]共轭;输入的N如果是偶数,那么
np.
fft
.
fft
进行
快速傅里叶变换
,需要特别注意的是,默认是对最后个维度的数据进行
fft
变换,若你输入的是一维数组,请忽略后面,如果你是二维列矢量,如果不将数据变为行矢量或将axis参数设为0,将得到与输入相同的结果,导致后续的计算无缘无故出错。
二话不说,直接上代码,产生一个正弦信号,并对其进行
fft
变换,对应的频率点可通过np.
fft
.
fft
freq计算得到,需要输入的两个参数分别是
FFT
的长度和采样时间间隔。
需要注意的是
fft
计算出来的幅度一般与真实的是不一样的,在i
fft
中会考虑这个因素,
快速傅里叶变换
(
fft
)
什么是傅里叶变换?
傅里叶定理: 任何一条周期曲线, 无论多么跳跃或不规则, 都能表示成一组光滑正弦曲线叠加之和. 傅里叶变换即是把这条周期曲线拆解成一组光滑正弦曲线的过程.
傅里叶变换的目的是将时域(时间域)上的信号转变为频域(频率域)上的信号, 随着域的不同,对同一个事物的了解角度也随之改变. 因此在时域中某些不好处理的地方, 放在频域中就可以较为简单的处理. 这样可以大量减少处理的数据量.
傅里叶定理:
y=A1sin(ω1x+ϕ1)+A2sin(ω2x+ϕ2)+..+C
傅里叶变换
傅立叶变换用于分析各种滤波器的频率特性。可以将图像视为在两个方向上采样的信号。因此,在X 和Y方向都进行傅立叶变换,可以得到图像的频率表示。图像中的振幅在哪里急剧变化?在边缘点或噪声。因此,可以说边缘和噪声是图像中的高频内容。如果幅度没有太大变化,则它是低频分量。
Numpy
中的傅里叶变化
Numpy
函数介绍
numpy
.
fft
.
fft
()
该函数计算一维傅里叶变换,它的第一个参数是一维数组。第二个参数是可选的,它决定输出数组的大小。如果它大于输入数组的大小,则在计算
FFT
之前用零填充输入数组。
# 生成信号
t = np.linspace(0, 1, 400, endpoint=False)
x = np.sin(2*np.pi*10*t) + np.sin(2*np.pi*30*t)
# 进行傅里叶变换
X = np.
fft
.
fft
(x)
# 计算频率轴
freqs = np.
fft
.
fft
freq(len(x))
# 将低于 20 Hz 的频率成分置零
X[freqs < 20] = 0
# 进行傅里叶逆变换
y = np.
fft
.i
fft
(X)
# 绘制原始信号和滤波后的信号
plt.figure(figsize=(8, 4))
plt.subplot(2, 1, 1)
plt.plot(t, x)
plt.title('Original signal')
plt.subplot(2, 1, 2)
plt.plot(t, y.real)
plt.title('Filtered signal')
plt.tight_layout()
plt.show()
这段代码中,我们首先生成了一个包含两个正弦波的信号,然后使用 np.
fft
.
fft
函数对其进行傅里叶变换得到频域信号 X,接着使用 np.
fft
.
fft
freq 函数计算频率轴,将低于 20 Hz 的频率成分置零,最后使用 np.
fft
.i
fft
函数进行傅里叶逆变换得到滤波后的信号 y。最后,我们使用 matplotlib 库将原始信号和滤波后的信号绘制出来,以便进行比较。