matlab fft计算功率,使用 FFT 获得功率频谱密度估计

具有指定采样率的偶数长度输入

对于一个采样率为 1 kHz 的偶数长度信号,分别使用 fft 和 periodogram 获得其周期图。比较二者的结果。

创建一个含 N(0,1) 加性噪声的 100 Hz 正弦波信号。采样频率为 1 kHz。信号长度为 1000 个采样点。使用随机数生成器的默认设置以获得可重现的结果。

rng default

Fs = 1000;

t = 0:1/Fs:1-1/Fs;

x = cos(2*pi*100*t) + randn(size(t));

使用 fft 获取周期图。信号是偶数长度的实数值信号。由于信号是实数值信号,您只需要对正负频率之一进行功率估计。为了保持总功率不变,将同时在两组(正频率和负频率)中出现的所有频率乘以因子 2。零频率 (DC) 和 Nyquist 频率不会出现两次。绘制结果。

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,10*log10(psdx))

grid on

title('Periodogram Using FFT')

xlabel('Frequency (Hz)')

ylabel('Power/Frequency (dB/Hz)')

f9a085e96ccf2b37a53307731352d2e1.png

计算并使用 periodogram 绘制周期图。二者的结果相同。

periodogram(x,rectwin(length(x)),length(x),Fs)

15abf8b6b0241267d44028e6dc77c025.png

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x),Fs))

mxerr = 3.4694e-18

具有归一化频率的输入

通过 fft 为使用归一化频率的输入生成周期图。创建一个带 N(0,1) 加性噪声的正弦波信号。该正弦波的角频率为 π/4 弧度/采样点。使用随机数生成器的默认设置以获得可重现的结果。

rng default

n = 0:999;

x = cos(pi/4*n) + randn(size(n));

使用 fft 获取周期图。信号是偶数长度的实数值信号。由于信号是实数值信号,您只需要对正负频率之一进行功率估计。为了保持总功率不变,将同时在两组(正频率和负频率)中出现的所有频率乘以因子 2。零频率 (DC) 和 Nyquist 频率不会出现两次。绘制结果。

N = length(x);

xdft = fft(x);

xdft = xdft(1:N/2+1);

psdx = (1/(2*pi*N)) * abs(xdft).^2;

psdx(2:end-1) = 2*psdx(2:end-1);

freq = 0:(2*pi)/N:pi;

plot(freq/pi,10*log10(psdx))

grid on

title('Periodogram Using FFT')

xlabel('Normalized Frequency (\times\pi rad/sample)')

ylabel('Power/Frequency (dB/rad/sample)')

dc8cac10c0a9d198072a482680e671fe.png

计算并使用 periodogram 绘制周期图。二者的结果相同。

periodogram(x,rectwin(length(x)),length(x))

365bd9d390f475096fe8995b64073836.png

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x)))

mxerr = 1.4211e-14

具有归一化频率的复数值输入

使用 fft 为具有归一化频率的复数值输入生成周期图。采用一个带 N(0,1) 复噪声的复指数信号,角频率为 π/4 弧度/采样点。采用随机数生成器的默认设置,以获得可重现的结果。

rng default

n = 0:999;

x = exp(1j*pi/4*n) + [1 1j]*randn(2,length(n))/sqrt(2);

使用 fft 获得周期图。由于输入是复数值,此处求 [0,2π) 弧度/采样点区间内的周期图。绘制结果。

N = length(x);

xdft = fft(x);

psdx = (1/(2*pi*N)) * abs(xdft).^2;

freq = 0:(2*pi)/N:2*pi-(2*pi)/N;

plot(freq/pi,10*log10(psdx))

grid on

title('Periodogram Using FFT')

xlabel('Normalized Frequency (\times\pi rad/sample)')

ylabel('Power/Frequency (dB/rad/sample)')

66ca39a1e177cae00b51faa216bcb87f.png

使用 periodogram 获取并绘制周期图。比较 PSD 估计。

periodogram(x,rectwin(length(x)),length(x),'twosided')

2f256a9b9b757c3d4bba759713e2c649.png

mxerr = max(psdx'-periodogram(x,rectwin(length(x)),length(x),'twosided'))

mxerr = 2.8422e-14

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值