【详细易懂】快速傅里叶变换(FFT)生成的频率、幅度具体求解过程

快速傅里叶变换的过程可以用一句话概括:

“通过计算,把信号的配方罗列出来”

即:已知一个时域的随时间变化的信号,该信号可以通过FFT拆分该信号,得到由该信号分解后得到的由不同频率及其幅度组成的频域图,其直观图如下图所示。

\Rightarrow

1、确定三个参数

这三个参数分别为采样频率Fs、信号最高频率F、采样点数N。

在这里我们假定已知信号最高频率F为600Hz,根据采样定理,我们设定采样频率为1400Hz。

采样定理:采样频率Fs > 信号频率的2倍

采样频率1400Hz即为一秒内有1400个采样点。

最后可得:N=1400    F=600Hz    Fs=1400Hz 

2、FFT求解生成的幅度
①进行FFT

在上述三个参数的基础上,我们进行FFT,得到 N 个复数。

每个复数都包含着各自特定频率的信息,根据这 N 个复数,我们可以得到原始信号拆分后的各个频率及其对应的幅度值,如下图所示(下图为双边振幅谱)

②求出复数的绝对值

但是直接用复数画出的图不是我们想要的,需要求出全部N个复数的绝对值(即模长),如下图所示,上图中的负数值没有了。

③归一化

最后对纵坐标的振幅需要进行归一化处理才能得到最终的幅度值。

上图中,横坐标为0Hz对应的信号强度(信号振幅),称为直流分量。它对应的振幅求解如下所示:

0Hz对应振幅 = 当前值 / 采样点数N

(即为直流分量对应振幅 = 14000 / 1400 = 10)

注意:直流分量以外的分量所对应的信号振幅求解与上述不太一样,如下所示:

其余频率对应的振幅 = 当前值 /(采样点数N / 2)

(即为:200Hz对应振幅 = 5000 / (1400 / 2) ≈ 7.14)

进行归一化后,我们最终得到如下图所示。

3、FFT求解生成的频率
 ①频率公式

我们进行FFT后得到的第x个(x从0开始)复数值对应的实际频率为

f(x) = x * (Fs / N)

-f(x) 为实际频率值

-x为第几个复数值

-Fs为采样频率

-N为采样点数

举例:

第0个点的频率 f(0) = 0 * (1400 / 1400) = 0
第1个点的频率 f(0) = 1 * (1400 / 1400) = 1
第2个点的频率 f(0) = 2 * (1400 / 1400) = 2

②删除重复值

由于FFT得到的结果是对称的,因此我们要删除一半的值,只有0 ~ N/2 这一半的频率是有效的,如下图所示。

### 使用快速傅里叶变换实现整数乘法 通过利用多项式的表示方法,可以将两个大整数相乘的问题转化为卷积计算问题。具体来说,如果把每个整数看作系数向量,则这两个整数的乘积对应于它们作为系数所定义之多项式乘积的结果。 为了提高效率,在实际操作过程中通常采用分治策略来减少所需执行的操作次数。而FFT(Fast Fourier Transform),即快速傅立叶变换算法提供了一种有效途径去加速此类卷积运算过程[^1]。 #### 实现步骤概述 当处理基于FFT的大整数相乘时: - 首先需要将待求解的大整数转换成适合用于离散傅里叶变换的形式; - 接着应用FFT将其映射到频域空间内完成相应位置上的逐项相乘; - 最后再逆向运用IFFT (Inverse Fast Fourier Transform) 把所得结果变换成原始形式下的数值表达。 下面给出一段Python代码片段展示这一流程的具体实践方式: ```python import numpy as np def fft_multiply(x, y): # 将输入字符串转为列表并反转以便后续处理 X = list(map(int, reversed(str(x)))) Y = list(map(int, reversed(str(y)))) n = max(len(X), len(Y)) while True: if n & (n - 1) == 0: break # 找到大于等于当前长度最小2次幂 n += 1 # 补零至最接近的2的幂次方大小 X.extend([0]*(n-len(X))) Y.extend([0]*(n-len(Y))) # 应用 FFT 进行变换 FX = np.fft.fft(X) FY = np.fft.fft(Y) # 对应位相乘得到新的频率序列 FZ = FX * FY # IFFT 变回时域信号,并取实部舍弃虚部误差 Z = np.fft.ifft(FZ).real.round().astype(int) result = sum(digit*(10**i) for i,digit in enumerate(Z)) return int(''.join(map(str,Z[::-1])).lstrip('0') or '0') ``` 此函数接受两个正整数参数`x`, `y`并通过上述提到的方法返回两者相乘后的结果。注意这里简化了一些细节比如溢出检查等以保持逻辑清晰易懂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值