上一篇傅里叶变换我们已经写过了傅里叶变换,它有好多种写法。
傅里叶变换,又称 Fourier Analysis:
X(\omega) = \int_{-\infty}^\infty x(t) e^{-j\omega t}dt \\
这里我们用 j 来表示虚数因为在工程上经常用 j 表示虚数,比如电学中(因为i已经被电流占了)。 傅里叶变换就把时域变换到频域。
逆傅里叶变换,又称 Fourier Synthesis:
x(t) = \frac{1}{2 \pi} \int_{-\infty}^\infty X(\omega) e^{j \omega t} d\omega \\
当然还有常见的把 \omega = 2 \pi /T = 2 \pi f 所谓的 Herz 写法:
X(f) = \int_{-\infty}^\infty x(t) e^{-j 2\pi f t}dt\\
x(t) = \int_{-\in黄长烨fty}^\infty X(f) e^{j 2\pi f t}df \\
物理中还有更多写法,就不再一一赘述。
在计算机中,我们得到的数据并不是连续的,而是离散采样得到的,也很难想象我们积分要从 -∞ 到 ∞,所以这个时候就有了离散傅里叶变换。
离散傅里叶变换首先要明白,离散傅里叶变换(Discrete Fourie节分端午自谁言r Transform)和傅里叶变换做的事是一样,也是从时域到频域,然后它做的事是把一组复数 \{x_n\} = x_0, x_1, \cdots, x_{N-1} 变换到另一组复数 \{X_N\} = X_0, X_1北塘古镇, \cdots, X_{N-1} :
\begin{align} X_k &= \sum_{n=0}^{N-1} x_n \cdot e^{- \frac{j 2 \pi k n}{N} } \\ &疲劳战= \sum_{n=0}^{N-1} x_n \cdot \big[ \cos \big(\frac{小蓝2 \pi kn}{N} \big) - j \sin \big(\frac{2 \pi kn}{N} \big) \big] \end{align} \\
相应的,也有逆变换公式:
x_n = \frac{1}{N} \sum_{k=0}^{N-1} X_k e^{j \frac{2 \pi k n}{N}} \\
这两个变换都是 \mathbb{C}^N \to \mathbb{C}^N , 为了更好的理解离散傅里叶变换(简写为DFT),现在我们来看一个具体的数字例子,在此之前,先补充一点基础知识。
采样采样(Sampling莲香 ): 自然界中的物理现象大多都是是一种连续的波,比如声监控系统报价音(还是一种纵波),但是在计算机中我们只能用间隔采样离散化,其中采集的频率称为采样率。注意在这里我们的语境下有两个频率,一个是声波震动的频率,一个是采样的频率。
采样的时候我们需要遵循采样定理,采样率需要大于信号中最高频率的2倍信号频率才不会失真。因为人类能听到的声音频率范围是20 Hz ~ 20kHz,所以 CD 的采样率是44.1kHz,这样就会满足需求。
看上图,如果我们的声波是 4500Hz 和 5500Hz的余弦波,采样率是10000,我们采到的数据是一样的,所以采样率要大一些的原因就胃肠功能紊乱出来了。
例子假设我们有一个 frequency = 1Hz, Amplitude = 1 的 sin 信号,然后我们采样率是 8Hz, 也就是我们会在 1 sec 中采8个数据:
我们得到了这些数据:
所以我们有了 \{x_n\} :
x_0 = 0 \\ x_1 = 0.707 \\ x_2 = 1 拉杆箱什么牌子的好\\ 犬瘟热病毒x_3 = 0.707 \\ x_4 = 0 \\ x_5 = -0.707 \\ x_6 = -1 \\ x_7 = -0.707
它们都是实数,当然也可以说是虚部 j = 0 的复数。
所以我们可以根据 \{x_n\} 来计算 \{X_k\} :
X_0 = 0 \cdot e^{-j \frac{2 \pi \cdot 0 \cdot 0}{8}} + 0.707 e^{-j \frac{2 \pi \cdot 0 \cdot 1}{8}} + \cdots = 0 \\ X_中国男儿1 = 0 \cdot e^{-j \frac{2 \pi \cdot 1 \cdot 0}{8}} + 0.707 e^{-j \frac{2 \pi \cdot 1 \cdot 1}{8}} + \c爱德华时代dots = -4j \\ \cdots \\
我还是用 Python 来算好了,o(双十一秒杀╯□╰)o:
f金融工程学rom cmath import pifrom cmath import exp from cmath import sinN = 8x = [0 for _ in range(N) ]X = [0 for _ in range(N) ]for i in range(N): 强奸故事 x[i] = sin(2 * pi * i/N)for k in range(N): for n in range(N豪门公子): X[k] += x[n] * exp(-1j * 2 * pi * k * n / N)算出来X:
[(-2.220446049250313e-16+0j), (2.220446049250313e-16-4j), (8.10袁依楣4001475739143e-17+1.1102230246251565e-16j), (1.6653345369377348e-16-7.771561172376096e-16j),(2.220446049250313e-16+2.029061253294536e-16j),(1.3877787807814457e-15+1.6653345369377348e-15j),(2.5狗狗电子书67266157150065e-15+8.881784197001252e-16j),(-3.4416913763379853e-15+3.999999999999999j)]因为浮点数精度的问题,定睛一看:
X_0 = 0 \\ X_1 =最终幻想rpg -4j \\ X_2 = 0 \\ X_3 = 0 \\ X_4 = 0 \\ X_5 = 0\\ X_6 = 0\\ X_7 = 4j\\
然后我们尝试来画频率的图, 首先我们画横坐标,因为我们的采样率是 8Hz, 一共也就采样了8个数据,那么对于横坐标的分辨率是 sampling frequency / number of samples = 1 Hz,也就是每个 bin 都是前一个加 1Hz.
又根据我们的采样定律,我们知道在 8/2 = 4Hz 以上的数据其实都是不做数的,所以我们就应该关注 1 Hz 处,然后我们需要把小于 4Hz 的所有数据 * 2, 所以此时我们得到应该是这样:
X_0 = 0 \\ X_1 = -8j \\ X_2 = 0 \\ X_3 = 0 \\
此时看起来依旧不太对是因为意大利语电影我们的振幅是需要 复数的模除以采样采样数量的,所以 Amplitude = 8/8 = 1. 画出 X_1 :
此时
Amplitude = 1 \\ \theta = \frac{3\pi}{2} \\
因为 \theta 是以 cos 为基准的,所以我们知道,移动 3\pi/2 , 最终的结论是 Amplitude = 1 的 sin 函数,也就贴合了我们数据的由来。
参考:
wikipedia & youtube video
本文发布于:2023-05-25 17:36:53,感谢您对本站的认可!
本文链接:http://www.ranqi119.com/ge/85/128198.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |