深入浅出解释FFT(七)——fft求频谱图和功率谱密度图

频谱图:

声音频率与能量的关系用频谱表示。在实际使用中,频谱图有三种,即线性振幅谱、对数振幅谱、自功率谱。线性振幅谱的纵坐标有明确的物理量纲,是最常用的。对数振幅谱中各谱线的振幅都作了对数计算,所以其纵坐标的单位是dB(分贝)。这个变换的目的是使那些振幅较低的成分相对高振幅成分得以拉高,以便观察掩盖在低幅噪声中的周期信号。自功率谱是先对测量信号作自相关卷积,目的是去掉随机干扰噪声,保留并突出周期性信号,损失了相位特征,然后再作傅里叶变换。自功率谱图使得周期性信号更加突出。


功率谱图:又叫功率谱密度图

功率谱是功率谱密度函数的简称,它定义为单位频带内的信号功率。它表示了信号功率随着频率的变化情况,即信号功率在频域的分布状况。

功率谱表示了信号功率随着频率的变化关系  常用于功率信号(区别于能量信号)的表述与分析,其曲线(即功率谱曲线)一般横坐标为频率,纵坐标为功率。
由于功率没有负值,所以功率谱曲线上的纵坐标也没有负数值,功率谱曲线所覆盖的面积在数值上等于信号的总功率(能量)。


时域和频域能量相等。

Parseval 定理

这里写图片描述

  有限上序列x{k}的离散fourier变换是正交变换,满足Parseval能量守恒定理,反映了序列在时域的能量等于其变换域的能量。
  关于能量定义:信号幅度平方的积分,如果是数字信号,能量就是各点信号幅度值平方后的求和。
  论坛帖子中关于等式关系给出的结论是:

求和 (x(tn)^2)T=RMS^2*Ttotal=求和(P(fn))△f*Ttotal
其中,x(tn)是n个x(t)时域采样数据,T是时间间隔,Ttotal是时间总长,
P(fn)是第n个功率谱密度值,△f是FFT频率间隔

 最后的结论是相等的,但是信号的能量到底是sum(x.^2),还是sum(x.^2)*T?按照定义来说是前者没错。但是绝对的能量计算若不跟采样频率(采样间隔)结合起来,又有什么对比作用?
 同样1000个点幅值为1,一组波形是1秒内采到的,另一组波形是10秒内采到的,按公式算,信号的能量相等,按sum(x.^2)*T计算,10秒采集到的波形的能量更大。
 现实情况中,比较两个波形的能量或有效值,都是采样率相同,采样时间相同,所有不会遇到如此纠结的问题。
  生成一组信号:

fs=1000;

>> N=1000;
>> n=0:N-1;
>> t=n/fs;
>> x=sin(2*pi*100*t);
>> nfft=1024;
>> deltF=fs/nfft;
>> window=hanning(N);
>> %直接法,periodogram函数得到的功率谱密度
>>[Pxx_period,f_period]=periodogram(x,window,nfft,fs); 
> noverlap=50; 
>>[Pxx_welch,f_welch]=pwelch(x,window,noverlap,nfft,fs);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

计算原始信号的有效值为: 0.0224
画出频谱与功率谱密度为:
幅值谱 与 功率谱
幅值谱的幅值理论上应为1,不到1的原因是fft变换的点数与采样点数不同所致。
利用FFT幅值谱的平方/N ,画功率谱密度结果跟上右图差不多。

 xw=1.633*x.*window';     % 加汉宁窗(恢复系数为1.633),能量修正系数使加窗后能量保证不变
mag=abs(fft(xw,nfft));
Pxx_1=mag.^2/N/fs;
f=(0:nfft/2-1)/nfft*fs;
plot(f,Pxx_11(1:512)*2),title('Pxx_11')
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

关于功率谱密度计算,先做自相关计算,再做FFT也能得到功率谱密度。
最后结果为:
这里写图片描述
summary:
当采样点数=nfft时,deltF*N/fs=1;
  功率谱密度直接求和即是频域能量。
  用幅值谱的平方估计频域能量时,除完点数,还要除以采样频率。
  时域能量要*采样间隔(1/fs)
有效值的平方*采样时间=时域能量;


  • 70
    点赞
  • 553
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
要使用FFTW3计算功率谱功率谱密度,可以按照以下步骤进行: 1. 使用FFTW3库进行FFT变换,可以使用fftw_plan_dft_1d函数创建一个一维FFT变换计划。 2. 将要进行FFT变换的数据复制到输入数组中,可以使用fftw_execute函数执行FFT变换。 3. 获取FFT变换结果,可以使用fftw_complex类型的输出数组或fftw_plan_dft_1d函数中指定的输出数组。 4. 将FFT结果的模的平方作为功率谱,可以使用下面的代码计算: ```c double *power_spectrum = (double *)malloc(sizeof(double) * N); for (int i = 0; i < N; i++) { power_spectrum[i] = pow(output[i][0], 2) + pow(output[i][1], 2); } ``` 其中,N为FFT变换的长度,output为FFT变换结果。 5. 计算功率谱密度,可以将功率谱除以信号长度,并乘以一个归一化系数。可以使用下面的代码计算: ```c double *power_spectrum_density = (double *)malloc(sizeof(double) * N); for (int i = 0; i < N; i++) { power_spectrum_density[i] = power_spectrum[i] / (N * normalization_factor); } ``` 其中,normalization_factor为归一化系数,可以使用FFT变换的采样频率和信号长度计算得到。 注意,这里的功率谱密度是双边谱密度,在频域上是对称的,需要取一半才是单边谱密度。可以使用下面的代码把功率谱密度转换为单边谱密度: ```c for (int i = 1; i < N/2; i++) { power_spectrum_density[i] *= 2; } power_spectrum_density[0] *= 0.5; power_spectrum_density[N/2] *= 0.5; ``` 其中,N为FFT变换的长度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值