使用matlab进行功率谱估计之-纠误:很多人喜欢用2/N来纠正fft的幅度值
先附上matlab官方文档对于使用fft进行功率谱估计的代码:
copy%创建一个含 N(0,1) 加性噪声的 100 Hz 正弦波信号。采样频率为 1 kHz。信号长度为 1000 个采样。
fs = 1000;
t = 0:1/fs:1-1/fs;
x = cos(2*pi*100*t) + randn(size(t));
%使用 fft 获取周期图。信号是偶数长度的实数值信号。由于信号是实数值信号,
%您只需要对正负频率之一进行功率估计。为了保持总功率不变,将同时在两组
%(正频率和负频率)中出现的所有频率乘以因子 2。零频率 (DC) 和奈奎斯特
%频率不会出现两次。绘制结果。
N = length(x);
xdft = fft(x);
xdft = xdft(1:N/2+1);
psdx = (1/(fs*N)) * abs(xdft).^2;
psdx(2:end-1) = 2*psdx(2:end-1);
freq = 0:fs/length(x):fs/2;
plot(freq,pow2db(psdx))
grid on
title("Periodogram Using FFT")
xlabel("Frequency (Hz)")
ylabel("Power/Frequency (dB/Hz)")
我们主要关心,在代码中是如何对DFT的值进行缩放的,并给出理论支撑。
1.功率谱密度定义
确知功率信号的功率为
功率谱密度为
2.数字域与连续域傅里叶变换的关系
用
等号右边是连续傅里叶变换,左边是离散傅里叶变换。
可以看到,在幅度上,DTFT有了一个采样频率的加权.注意,这里的T是采样周期,下文会用
3.DFT与DTFT关系
幅度没区别,看成DTFT的采样就行
4.分析代码
(1/(fs*N)) * abs(xdft).^2
.首先对连续时间信号采样N个点,得到它的DFT,记为
需要获得功率谱密度
后注
为什么FFT变换后的幅值感觉不对? 请看一下问题出在哪里(matlab环境)。
百度一下,如何获得FFT的真实值,很多人会说,fft的结果乘2/N,得到所谓的“真实幅度值”.论证方法就是,产生一个正弦信号,进行fft,发现幅度值很大,然后除以N,发现合理了.
这里有两个问题,一是通常没有人给出合理的理论支撑,个人对其正确性和有用性持怀疑态度。
正弦信号的FT是冲激函数,本身幅度值就是无穷大,冲激强度是面积大小。你非得给人家幅度值归一化到1,如果不是周期信号呢?频谱没有冲激函数,你怎么办?还这么归一化吗?而且这么归一化后会导致帕斯瓦尔定理不能用,可能唯一的用途就是分辨一下周期信号的幅度了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步