功率谱和FFT变换频谱

功率谱:

nfft=length(total_wave);
window1=hamming(100); %海明窗
noverlap=20; %数据无重叠
range='onesided'; %频率间隔为[0 Fs/2],只计算一半的频率
[Pxx1,f_PSD]=pwelch(total_wave',window1,noverlap,nfft,Fs,range);
plot_Pxx1=10*log10(Pxx1);
figure
plot(f_PSD,plot_Pxx1);

 

 

频谱和功率谱的区别:

频谱的横轴是频率,纵轴是这个频率信号对应的振幅

功率谱

 

 

1)  fs采样频率的设定:

    Nyquist条件给出了采样频率设定的基本原则, 即采样频率必须大于等于信号频率的2倍。具体设定时,采样频率要能够大于等于信号中最高频率分量值的2倍,令fs表示采样频率,fh表示信号频谱的最高频率,那么要求: fs>=2fh, 否则将出现频谱混叠现象。一般在工程上选择采样频率为信号最高频率的5~10倍。

2) n 采样长度的设定:

    在模拟进行频谱分析时,要自行设定采样点数N或采样的时间长度T。

   在FFT变换后,频谱中能够区分出的最小频率刻度就是变换后的频率分辨率,满足:df=fs/n, n为FFT 变换的点数;即FFT结果只能表示k*df (k=0,1,2,…)频率坐标上的信号幅值,如果信号中的频率分量值不等于k*df,而介于k*df与(k+1)*df之间时,FFT变换的结果会将该频率分量的幅值泄露到其邻近的频率坐标位置上,从而出现FFT分析的信号泄露情况。因此,应当合理设定采样点数,使得信号中的各频率分量值能够被df整除,从而使得变换后的信号频谱能够更好地描述信号特性。

3)  FFT变换特性:

     FFT算法特性使得变换后不仅包括正频率部分,也包括负频率部分,如设置采样频率为120Hz,采样信号中包括频率分量10Hz、50Hz,则可知满足Nyquist采样定理,不会出现频谱混叠;经过FFT变换后,在频率坐标的10Hz和50Hz位置处将出现频谱峰值,而在110Hz和70Hz位置也同样出现,其实即是变换后的负频率成分-10Hz、-50Hz搬移120Hz后的结果。因此在分析上仅使用单边的变换结果就够用了

 

fft 采样频率Fs和采样点数N应该怎么确定?

已知离散信号频率100KSa/s,时间20s,即一共2000000个信号点。现在想作fft,则采样频率Fs和采样点数N应该怎么取呢?
Fs>=2*最高信号频率(奈奎斯特采样定律),还是说Fs=100K就可以?
N=Fs*20s,还是说N可以任意取,取2的阶乘次比较好呢?

 

1.你的这个采样速率是可以算出来的,“ 时间20s,即一共2000000个信号点”,那么采样速率自然就是100K了,所以给的那个就是采样速率。

2.N取默认值即可(即N为信号长度的点数),matlab现在不要求N必须是2的幂次了,速度非常快的。

3.顺便说一下,做出来的fft也是2000000个点,对应着0~Fs之间的频率。

如果取信号的长度作为采样点,信号的采样频率作为FFT的采样频率,频谱结果为0~Fs之间的频率

满足奈奎斯特采样定理的前提下,采样频率越高,时域内信号分辨率就越高,采集到的信号就越接近原始信号,在频谱上的频带就越宽,有利于后期频域分析

 

傅里叶变换中涉及到的函数:

1、linspace(x1,x2,N)  

功能:linspace是Matlab中的一个指令,用于产生x1,x2之间的N点行矢量。其中x1、x2、N分别为起始值、中止值、元素个数。若缺省N,默认点数为100

 

时域和频域的关系:

时域的采样会造成频域的周期性

按傅里叶分析的原理,任何周期信号都可以用一组三角函数的组合表示

时域到频域的计算:根据w=2πf计算

 横坐标是频率,纵坐标是对应频率成分的幅度(牢记)

功率谱和FFT变换频谱_第1张图片

 

画出信号的时域图(目前横轴表示的是一个数据包),信号采样频率设置为200HZ(0.005s)

t=0:0.005:(length(x)-1)*0.005

 

t_s=0.005%采样周期

f_s=1/t_s=200%采样频率

f_x=0:200/end_point:f_s

plot(f_x,abs(y))

 

 

FFT,DFT关系:

1、想对一段序列做DFT,但matlab中没有现成的DFT函数,百度了一下说是可以用FFT来代替,用FFT做出来后频率是对了,但为什么会有对称的两个峰值?

 

2、实验数据是离散的,自己用的连续信号的傅里叶变换,应该用离散信号的傅里叶变换

1、周期信号的傅里叶变换是离散的频谱(有限值)

2、离散信号的傅里叶变换是周期的函数。

3、非周期信号的傅里叶变换是连续频谱

非周期离散信号?

把数据全部转换为列向量

 

FFT变换后图像:

1、离散傅里叶变换之后频率为0点处对应的峰值很大,那是零频信号,就是直流分量。DFT后,会有一个直流分量。一般频谱仪的零频处都有一个输出。

去除直流分量的方法:直接减均值操作

xn2=after_wavelet_best-mean(after_wavelet_best);(从效果上看还是挺好的)

2、实信号fft变换频谱是关于二分之N对称的,复信号fft变换后不是对称的(横轴表示什么含义?)

3、确定频谱图中各点的坐标

功率谱和FFT变换频谱_第2张图片

看到的最高点不一定是我们想要的频率成分

 

正确示例说明:

[f_1,amp_1] = wfre(64, len, data);
plot(f_1,amp_1(1:fix(len/2)))
xlabel('频率 (Hz)')
ylabel('信号幅度')
title('PPG信号的频谱图')



%频谱分析,返回横轴频率和幅度
function [f,amp] = wfre (Fs,N,x)
    y = fft(x,N);
    amp =abs(y)/N;% y.*conj(y)/N;
    f = Fs/N*(0:fix(N/2)-1);
end

必须除数据点数

 

 

尝试过的方法:

1、直接传入信号和信号的点数(没有频谱)

2、

N=512;
n=0:N-1;
X=dft(origin_wave,N);
magX=abs(X);

k=(0:length(magX)-1)*N/length(magX);
stem(k,magX);

function [Xk]=dft(xn,N)
n=[0:1:N-1];
k=[0:1:N-1];
WN=exp(-j*2*pi/N);
nk=n'*k;
WNnk=WN.^nk;
Xk=xn*WNnk
end

提示维度不一致(多次出现这个问题)

3、

xn=origin_wave;

M=length(xn);
n=[0:1:M-1];

N=1024;                         %原离散信号1024个点的DFT变换
k=[0:1:N-1];
 %xn=[1 1 1 1]
 %w=[-800:1:800]*pi/800;      %频域共-pi -- +pi(-800----+800)的长度(本应是无穷,高频分量很少,故省去) 
 Wn=exp(-j*2*pi/N);
 %X=xn*exp(-j.*(n'*w));         %求dtft变换,采用原始定义的方法,对复指数分量求和而得
 X=xn*(Wn.^(n'*k));  
stem(k,abs(X));
title('原信号的16点DFT变换');

提示错误使用  .^ 矩阵维度必须一致

4、直接进行FFT变换是可行的
%FFT
N=1000;                         %原离散信号有8点
n=[0:1:N-1]                  %原信号是1行8列的矩阵
%xn=0.5.^n;                   %构建原始信号,为指数信号
xn=origin_wave;
Xk=fft(xn,N);
subplot(221);
plot(n,xn);
title('原信号');
subplot(212);
plot(n,abs(Xk));
title('FFT变换')

问题和之前一样,原始信号在零频率处的幅度很大,其余地方幅度很小

你可能感兴趣的:(WIFI信号的心率检测)