用MATLAB处理语音信号,做fft后要获得单边谱。本文收集资料进行了推导,对于fft数值后续操作从理论上做了一个理解。并且简洁的解释了fft函数的结果。供大家参考,欢迎批评指正。
转载请注明原文地址:http://blog.csdn.net/ts_dchs/article/details/78030192
理论推导
三角函数形式傅里叶级数
根据傅里叶级数原始定义,其三角函数集合在一个周期上是完备正交集:
[公式1]
T是待分析信号的周期。所以每个频率分量:k/T下,频谱成分由括号内Ak项和Bk项共同决定,且都是非负角频率。也就是说想做成频率-幅度谱表示信号f(t)需要两个图。
指数形式傅里叶级数
通过欧拉公式变换得到等效形式,指数形式傅里叶级数。
[公式2]
变换的目的是期望频谱能用一个单一数值C_k表示,而不是分为A_k和B_k两个频谱图。
用如下方式得到C_k:
可见每个C_k由A_k和B_k共同影响,且对应公式一中一个频率分量kω0,在公式2中分为了双边频谱的两个谱线C_k与C_-k。最终得到指数形式傅里叶变换:
[公式3]
傅里叶级数与双边谱的关系
根据[公式3]中的C_k得到的双边频谱,就是双边谱。三角形式傅里叶级数项与双边谱幅度的关系推导如下:
由于本身是实信号,所以不会出现虚数项, C_k的相位φk取值为-π,0,π,故C_k与C_-k取值保持相同。所以对于双边幅度谱谱线大小:
信号处理时,可以用功率谱(功率谱密度)和频谱(频谱谱密度)来分析信号,功率谱需要先做自相关在做FFT,频谱直接用信号做FFT;功率谱是从能量的角度研究信号,频谱是从时域变为频域的对信号的描述。
傅里叶级数对应的单边谱
[公式1]还可以写为如下形式得到单边谱:
[公式4]
相比公式1,公式三只用一项表示特定频率的频谱,另外增加了相位信息。
[公式4]对应的频谱就是单边谱,[公式2]对应的频谱为双边谱,可见:
也就是相应频谱(k≠0)单边谱的幅度谱幅值大小,是双边谱中的两倍。相位奇对称。
MATLAB - fft函数解释
Y = fft(x),信号x长度为L,L是偶数,采样率Fs,得到的Y的结果是L个复数。复数的相位就是相同频率双边频谱频率对应的相位。频谱幅度的数值还需要求模除以L。C = abs(Y/L),C就为双边谱的幅值,其中:
- C(1)为直流分量,等于单边谱D_0;
- C(2:N/2+1)为双边谱正频率值幅值,对应频率从Fs/N ~ Fs/2;想变为单片谱还要乘以2。
- C(N/2+1:end)为双边谱负频率幅值,对应频率从-Fs/2 ~ -Fs/N,可以发现C(N/2+1)点被共用。
典型使用方法
Fs = 1000; % Sampling frequency
T = 1/Fs; % Sampling period
L = 1500; % Length of signal
t = (0:L-1)*T; % Time vector
S = 1*sin(2*pi*10*t) + 0.5*cos(2*pi*50*t); %signal with 2 components
Y = fft(S);
P2 = abs(Y/L); % 2-sides spectrum
P1 = P2(1:L/2+1); % fetch half of P2
P1(2:end-1) = 2*P1(2:end-1); % times 2 to turn to 1-side spectrum (k>0)
f = Fs*(0:(L/2))/L; % calculate real frequency of each point
plot(f,P1);
% 相位计算可以用 angle(Y(16))或者phase(Y(16))计算,结果为弧度。
补充
[公式4]推导三角变换基础:
通过以上计算过程与公式1,得到公式4。
Notification
source: 个人所学有限,若有错误和不足还请不吝赐教,我会及时更正。Terrence Zhou.
http://blog.csdn.net/ts_dchs/article/details/78030192
转载请注明原址