基于信号案例,解析离散傅里叶变换结果的本质与公式推导

本文深入探讨了快速傅立叶变换(FFT)的基本原理及其在信号分析中的应用。通过具体的数学推导,解释了如何从采样数据中提取信号的频率、振幅和相位信息。特别关注了信号的模拟过程、FFT的计算公式以及如何从结果中解码原始信号的参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设待分析的模拟信号为y(t) = A * sin(w1 * t + Q1) + B * sin(w2 * t + Q2) + C, FFT的目标就是根据采样点数据,获取A,B,w1, w2的信息(Q1,Q2假设为0)
用如下参数模拟未知信号y(t):
#define A 10
#define B 20
#define C 50

#define Q1 0
#define Q2 0

#define freq_signal_1 1
#define freq_signal_2 16
#define freq_sample (64 * freq_signal_1) //采样周期

w1 = 2 * pi* freq_signal_1;
w2 = 2 * pi* freq_signal_2;

令time[i] =i* T (T = 1 / freq_sample),所以采样数数据为为
(time[i],y (time[i]), i = 0 ~63
换一种表示方法,即为
(0*T,S0),(T, S1), … (63T, S63) //这是DFT或者FFT的唯一输入,其他信息理论上不可见的

按照离散傅里叶的变换公式
X(k) = Sum(S(i) * W(k,i,N)), (i = 0 ~N-1, N=64)//这是我们的计算机要计算的内容,,假设算出来的结果为Results (k)
下面的内容为其本质:
X(k) = Sum ( y(time[i]) * [cos(2 * pi * k * i/N) + j * sin(2* pi * k * i / N) ] ), (i = 0 ~ N-1, N= 64),
下面把y(time[i])进一步展开
= Sum ((A * sin(w1 * i / N) + B * sin (w2 * i / N ) +C ) * [cos(2 * pi * k * i/N) + j * sin(2* pi * k * i / N) ] ),展开如下
= Sum ( A * sin(w1 * i / N) * cos(2 * pi * k * i/N) + A * sin(w1 * i / N) * j * sin(2* pi * k * i / N)
+B * sin (w2 * i / N ) * cos(2 * pi * k * i/N) + B * sin (w2 * i / N ) * j * sin(2* pi * k * i / N)
+C * cos(2 * pi * k * i/N) + C * j * sin(2* pi * k * i / N) ),
当 k = 0时, X(k) = Sum ( A * sin(w1 * i / N) + B * sin (w2 * i / N ) +C),(i = 0 ~ N-1, N= 64),
= C * 64 (为啥带A,B两项的sum为0,这个需要自己理解下)
即 Results (0) = N * C,所以C = Results (0) / N,
说明:k = 0恰好是一个特殊的情况,换一个general k ( 即k !=0)试一下,先看带常数C的项,
Sum (C * cos(2 * pi * k * i/N) + C * j * sin(2* pi * k * i / N) ) , (i = 0 ~ N-1, N= 64)一定为0(直接观察可以得到该结果,原理请见下面的内容)
所以 X(k) = Sum ( A * sin(w1 * i / N) * cos(2 * pi * k * i/N) + A * sin(w1 * i / N) * j * sin(2* pi * k * i / N)
+B * sin (w2 * i / N ) * cos(2 * pi * k * i/N) + B * sin (w2 * i / N ) * j * sin(2* pi * k * i / N) ) , (i = 0 ~ N-1, N= 64)
将w1,w2带入
X(k) = Sum (
A * sin(2 * pi* freq_signal_1* i / N) * cos(2 * pi * k * i/N) +
A * sin(2 * pi* freq_signal_1* i / N) * sin(2* pi * k * i / N)* j +
B * sin(2 * pi* freq_signal_2* i / N) * cos(2 * pi * k * i/N) +
B * sin(2 * pi* freq_signal_2* i / N) * sin(2* pi * k * i / N) * j
) , (i = 0 ~ N-1, N= 64)

很重要的一句话,当k != freq_signal_1且k != freq_signal_2时,频率不同的三角函数相乘,在一个完整周期的积分必定为0(周期的整数倍也同样如此),上述中带C项的sum求和也满足该条件,常数与三角函数的积分,周期整数倍,所以
X(k = f1) = A * sum ( sin(2 * pi * f1 * i/N) * cos(2 * pi * f1 * i/N) + j * sin(2 * pi * f1 * i/N) * sin(2 * pi * f1 * i/N) )
= A * sum ( sin (W) cos(W) + j * sin (W) * sin (W))
= A * sum ((sin (W + W) + sin(W-W) /2 - j * (cos(W + W) -cos(W-W)) / 2)
= -j N * A /2
代码仿真出来,
X(0) = 3200, C = 3200 / 64;
X(1) = 0 - 320j, A * 2 = 320 / 64 ;
X (16) = 0 - 640j, B * 2 = 640 /64;
X (48) = 0 + 640 j
X (63) = 0 + 320j
为啥 为A/2, B/2 自己理解一下,卖个关子,从X(1)的数据还可以得出相位为-90度,即信号为cos (x - pi/2) 即为 sin x。

### 关于傅里叶变换频域分析的相关资料解题方法 #### 1. 傅里叶变换的核心概念 傅里叶变换是一种将时域信号转化为频域信号的方法,其核心思想是由法国科学家傅里叶提出的:任何周期性的复杂曲线都可以表示为一组光滑正弦曲线的叠加[^2]。这一过程使得原本难以处理的时间域问题可以在频率域上得到简化。 #### 2. 频域分析的意义 频域分析的主要目标是对信号的能量分布进行研究。通过傅里叶变换,可以将时间域中的连续变化映射到频率域中的一系列离散分量。这种转化不仅有助于理解信号本质特征,还能够显著降低数据存储需求并优化算法效率[^4]。 #### 3. 解题方法概述 对于涉及傅里叶变换和频域分析的题目,通常遵循以下几个方面展开解答: - **确定输入信号形式** 输入信号可能是已知解析表达式的函数或者采样获得的数据序列。如果给定的是时间域内的连续信号,则需先明确该信号的具体数学描述;如果是离散样本集合,则应考虑采用离散傅里叶变换 (DFT) 或快速傅里叶变换 (FFT)。 - **应用傅里叶变换公式** 对于连续信号 \( f(t) \),其对应的傅里叶变换定义如下: \[ F(\omega) = \int_{-\infty}^{+\infty} f(t)e^{-j\omega t}\,dt \] 而逆变换则用于恢复原始信号: \[ f(t) = \frac{1}{2\pi} \int_{-\infty}^{+\infty} F(\omega)e^{j\omega t}\,d\omega \] - **计算频谱特性** 计算完成后,可以从所得频谱图中提取有用信息,比如中心频率、带宽以及各成分的比例关系等参数。 - **实际案例分析** 下面给出一个具体的例子说明如何利用上述原理解决问题。 ```python import numpy as np import matplotlib.pyplot as plt # 定义时间轴 t = np.linspace(0, 1, 1000) # 构造复合信号 y = sin(2π*5t) + 0.5*sin(2π*10t) signal = np.sin(2 * np.pi * 5 * t) + 0.5 * np.sin(2 * np.pi * 10 * t) # 进行 FFT 变换 fft_result = np.fft.fft(signal) freqs = np.fft.fftfreq(len(t), d=t[1]-t[0]) # 绘制结果 plt.figure(figsize=(12, 6)) plt.subplot(1, 2, 1) plt.plot(t, signal) plt.title('Time Domain Signal') plt.xlabel('Time') plt.subplot(1, 2, 2) plt.stem(freqs[:len(freqs)//2], abs(fft_result)[:len(freqs)//2]*2/len(t)) plt.title('Frequency Spectrum') plt.xlabel('Frequency') plt.show() ``` 此代码片段展示了如何生成合成信号及其相应的频谱图表。从中可以看出两个明显的峰值分别对应于构成信号的基础频率(5Hz 和 10Hz),验证了理论推导结果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值