傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。在不同的研究领域,傅立叶变换具有多种不同的变体形式,如连续傅立叶变换和离散傅立叶变换。本文梳理基本知识。
Fourier transform或Transformée de Fourier有多个中文译名,常见的有“傅里叶变换”、“付立叶变换”、“傅立叶转换”、“傅氏转换”、“傅氏变换”、等等。
F(\omega) 叫做 {f}(\mathrm{t}) 的象函数, {f}({t}) 叫做 {F}(\omega) 的象原函数。 F (\omega) 是 {f}(\mathrm{t}) 的象, \mathrm{f}({t}) 是F(\omega)原象。
其中F(ω)叫做f(t)的象函数,f(t)叫做F(\omega) 的象原函数。 \mathrm{F}(\omega) 是 f(\mathrm{t}) 的象。 {f}({t}) 是 \mathrm{F}(\omega) 原象。
傅里叶级数适用于周期时间连续且无限长度的信号处理。但是我们需要对待处理信号进行采样,并且信号常常并非是周期的,同时采样时间也不可能是无穷长,这就意味着我们需要一个能够处理非周期离散时间信号的变换公式。
式中, W_{N}=\mathrm{e}^{-j\frac{2\pi}{N}}, N 称为 \mathrm{DFT} 变换区间长度, (N \geqslant M) 通常称上述两式为离散傅里叶变换对。 为了叙述简洁,常常用 {DFT[x(n)]} _ { N} 和 IDFT[X(k)]_{N} 分别表示 N 点离散傅里叶变换和 N 点离散傅里叶逆变换。
虽然讲了定义,相信没人能直接看懂,了解一些相关概念明白一下傅里叶变换是在干嘛。
是描述数学函数或物理信号对时间的关系。例如一个信号的时域波形可以表达信号随着时间的变化。是真实世界,是惟一实际存在的域。因为我们的经历都是在时域中发展和验证的,已经习惯于事件按时间的先后顺序地发生。
频域(frequency domain)是描述信号在频率方面特性时用到的一种坐标系。在电子学,控制系统工程和统计学中,频域图显示了在一个频率范围内每个给定频带内的信号量。频域,尤其在射频和通信系统中运用较多,在高速数字应用中也会遇到频域。频域最重要的性质是:它不是真实的,而是一个数学构造。时域是惟一客观存在的域,而频域是一个遵循特定规则的数学范畴,频域也被一些学者称为上帝视角。
时域分析与频域分析是对模拟信号的两个观察面。时域分析是以时间轴为坐标表示动态信号的关系;频域分析是把信号变为以频率轴为坐标表示出来。一般来说,时域的表示较为形象与直观,频域分析则更为简练,剖析问题更为深刻和方便。信号分析的趋势是从时域向频域发展。然而,它们是互相联系,缺一不可,相辅相成的。
import matplotlib.pyplot as plt
import cv2
import numpy as np
from scipy.fftpack import fft
if __name__ == '__main__':
image_path = 'test.png'
image = cv2.imread(image_path)
center = (np.array(image.shape[:2]) / 2).astype('int')[::-1].tolist()
assert center[0] == center[1]
radius = center[0]
size_x = 200
size_y = 200
output_img = cv2.warpPolar(image, (size_x, size_y), tuple(center), radius, 12)
output_img = output_img[:, :, 0]
signal = np.sum(output_img, axis=1)
signal = signal - signal.mean()
scipy_fft_y = fft(signal)
scipy_fft_y = scipy_fft_y[:len(scipy_fft_y)//2]
# energy_fft
abs_y = np.abs(scipy_fft_y)
# phase_fft
angle_y = np.angle(scipy_fft_y)
cycle_num = np.argmax(abs_y)
# cycle angle
cycle_angle = 360 / cycle_num
# phase
phase = cycle_angle / 2 / np.pi * angle_y[cycle_num]
print(f"周期 : {cycle_num}")
print(f"角度 : {cycle_angle}")
print(f"相位 : {phase}")
plt.plot(abs_y)
plt.show()
pass