FFT与信号波形幅值的关系:
A
m
p
=
m
a
x
(
a
b
s
(
f
f
t
(
x
)
)
⋅
2
/
l
e
n
g
t
h
(
x
)
)
Amp = max(abs(fft(x))\cdot 2/length(x))
Amp=max(abs(fft(x))⋅2/length(x))
FFT与信号能量的关系:
P
o
w
e
r
=
m
a
x
(
a
b
s
(
f
f
t
(
x
)
)
/
F
s
)
Power= max(abs(fft(x))/Fs)
Power=max(abs(fft(x))/Fs)
FFT处理增益与FFT点数的关系:
p
r
o
c
e
s
s
g
a
i
n
=
10
⋅
l
o
g
10
(
n
f
f
t
/
2
)
process_gain = 10\cdot log_{10}(nfft/2)
processgain=10⋅log10(nfft/2)
%% created by hyacinth on 24/5/6
clc
close all
clear
%%
Amp = 5; Fx = 10; Fs = 2e3; tend = 1;
t = 1/Fs:1/Fs:tend;
x = Amp*sin(2*pi*Fx*t);
f = @(t) Amp*sin(2*pi*Fx*t).^2;
power = integral(f,1/Fs,tend);
disp("信号能量为: "+num2str(power))
%% 证明FFT与信号幅值和能量的关系
% FFT点数需大于等于信号点数,否则计算出来的是真实值的(fft point)/(signal point)
N = 1*length(x);
signalAmp= abs(fftshift(fft(x,N)))*2/length(x);
signalPower= abs(fftshift(fft(x,N)))/Fs;
w = (floor(-N/2):floor(N/2)-1)*Fs/N;
figure;
subplot(2,1,1);plot(w,signalAmp,'.-');title("FFT与信号幅值")
subplot(2,1,2);plot(w,signalPower,'.-');title("FFT与信号能量")
%% 证明FFT处理增益为10log10((fft point)/2)
% 只有FFT点数小于等于信号点数时才有这个关系
N = 1*length(x);
snr = 10;
xn = addwgn(x,snr); % addwgn是我写的函数,更精确,可用awgn代替
Pxx = abs(fftshift(fft(xn,N)))/Fs;
w = (floor(-N/2):floor(N/2)-1)*Fs/N;
figure;
plot(w,Pxx,'.-');title("添加噪声后信号的FFT")
idx = find(Pxx==max(Pxx));
idx1 = idx(1);
idx2 = idx(2);
% sigPowerdB
sig=Pxx([idx1,idx2]);
sigPower = sum(abs(sig(:)).^2)/length(sig(:));
sigPowerdB = 10*log10(sigPower);
% noisePowerdB
Pxx(idx1)=0;Pxx(idx2)=0;
noisePower = sum(abs(Pxx(:)).^2)/(length(Pxx(:))-2);
noisePowerdB=10*log10(noisePower);
disp("理论处理增益: "+num2str(10*log10(N/2)))
disp("实际处理增益: "+num2str(sigPowerdB-noisePowerdB-snr))