分段斜坡组合信号傅里叶变换幅值校正疑问
首先得帮你理清:你定义的x(t) = r(t+1) - 2r(t) + r(t-1)其实是一个三角脉冲信号——在t∈[-1,1]区间内是1-|t|,其余区间为0,峰值是1。这个信号的连续傅里叶变换理论值是Sa²(ω/2)(也就是(sin(ω/2)/(ω/2))²),直流分量(ω=0)的幅值是1(信号的积分,也就是三角的面积)。
接下来解答你最疑惑的点:为什么要除以length(t)/100才能得到正确幅值?这本质是FFT与连续傅里叶变换的尺度匹配问题:
FFT计算的是离散信号的离散傅里叶变换(DFT),它的结果是对离散采样点的求和;而我们要的连续傅里叶变换是积分,积分可以近似为「采样点值 × 采样间隔Δt」的求和。所以DFT的结果和连续傅里叶变换X(ω)的关系是:X(ω_k) ≈ DFT结果 × Δt
看你的代码参数:
- 时间轴
t是linspace(-50,50,FS),总时间跨度是50 - (-50)=100秒,采样点数length(t)=FS=50000,所以采样间隔Δt ≈ 100/50000 = 1/500(因为linspace的间隔是(max(t)-min(t))/(length(t)-1),当采样点数很大时,length(t)-1≈length(t),所以Δt≈100/length(t))。
你写的X1 = fft(x1)/(length(t)/100),等价于X1 = fft(x1) × 100/length(t),这正好就是fft(x1) × Δt的近似!这就是为什么这么做能得到正确幅值——你相当于把DFT的求和结果乘以了采样间隔,把离散求和转换成了近似连续积分,匹配了连续傅里叶变换的幅值尺度。
举个直观的例子:直流分量(ω=0)的理论幅值是1,而DFT的直流分量是所有采样点的和sum(x1),sum(x1)≈∫x(t)/Δt(因为sum(x1)×Δt≈∫x(t)dt=1),所以sum(x1)≈1/Δt=500,除以length(t)/100=50000/100=500后,结果就是1,正好和理论值一致。
优化建议
不要硬编码100,而是动态计算采样间隔,这样不管时间轴怎么设置都能通用:
Δt = t(2) - t(1); % 因为linspace是均匀采样,直接取相邻两点的差 X1 = fft(x1) * Δt; R1 = fftshift(X1);
这样就不用依赖时间轴的总跨度硬编码数值,鲁棒性更强。
备注:内容来源于stack exchange,提问作者Farah

