信号的傅立叶变换

kaldi上有很多语音处理的代码知识
http://kaldi-asr.org/doc/feature-fbank-test_8cc.html

数字信号在时间和幅度上都是离散的信号。离散信号可以通过采样一个连续的时间信号得到,也可以直接由一个离散的时间过程产生。

傅里叶变换——对时间缺陷做改进,有短时傅里叶变换和小波变换

**傅里叶变换:**就是把信号从时域变换到频域,但是会丢失时间信号,不知道哪个频率信号对应哪个时间点出现和消失。因此傅里叶变换有明显的时间缺陷,可能导致两个时域相差很大的信号在傅里叶变化后频谱图一样。

在这里插入图片描述
如果一个信号的频率不随时间变化,称之为平稳信号,那么不必知道它对应的时间点,但是生活中遇到的大部分是非平稳信号。

短时傅里叶变换(STFT):加窗操作,将时域分解成无数个等长的小过程,每个过程近似平稳,再傅里叶变换,就知道那个时间点上出现了什么频率。
在这里插入图片描述
其中,g(t-u)是窗函数,实现在U附近的开窗和平移
窗口傅里叶变换的逆变形式
在这里插入图片描述
窗的长度影响时间分辨率和频率分辨率,两者折衷考虑,不能同时达到最优。
时间分辨率:信号频率随时间变化,要将频率的变化分辨出来,窗长度越短越好,使得窗内信号频率近似不变。
频率分辨率:同一时间段内有多个不同频率的信号叠加,要将不同频率的信号分离开来,需要窗长度越长,信号频率的差异性才能体现出来。
窗函数一旦确定,分辨率就不再变化,要改变分辨率,就要重新选择窗函数了。
matlab进行短时傅里叶变换
[S,F,T,P]=spectrogram(x,window,noverlap,nfft,fs)
x是输入数据
window窗函数,默认为nfft长度的汉明窗
如果window为一个整数,x将被分成window段,每段使用Hamming窗函数加窗
如果window是一个向量,x将被分成length(window)段,每一段使用window向量指定的

noverlap重叠部分,一般是50%
nfft做傅里叶变换的长度,
fs采样频率

汉明窗
窗函数 y = 0.54-0.46cos[2pin]
主要部分是sinx函数0~π的形状,其余部分为0,因此和信号相乘后,信号只有一部分有非零值,
通常小段的语音信号没有周期,被hamming window处理后像是周期信号,对窗函数内的数据进行傅里叶变换,窗两侧的信号被削弱,因此每次移动1/3或1/2的窗,前一两帧的信号缺失的数据得以重新体现。

matlab代码

a=audioread('enh.wav');   
%将音频信号jiasiqi.wav读入
subplot(2,1,1),                  %分配画布,一幅图上共两个图,这是第一个
plot(a);title('original signal');  %画出原始信号,即前面这个音频信号的原始波形
grid                              %添加网格线
N=256; 
%设置短时傅里叶变换的长度,同时也是汉明窗的长度

h=hann(N);       %设置汉明窗
for m=1:N        %用汉明窗截取信号,长度为N,主要是为了减少截断引起的栅栏效应等
b(m)=a(m)*h(m)
end
y=20*log(abs(fft(b)))           %做傅里叶变换,取其模值,即幅频特性,然后用分贝(dB)表示
subplot(2,1,2)                  %分配画布,第二副图
plot(y);title('短时谱');         %画出短时谱
grid                            %添加网格线

在这里插入图片描述
如何看出时间关系??

示例二

fs = 1000;
t = 0:1/fs:2;
y = audioread('D:\笔记\DNN 徐勇\sednn-master\sednn-master\enh_noisy_example\test3_ForestGump_logMMSE_enh.wav');
subplot(2,1,1),                  %分配画布,一幅图上共两个图,这是第一个
plot(y);title('original signal');  %画出原始信号,即前面这个音频信号的原始波形
grid                                    %添加网格线 


win_sz = 128;
han_win = hanning(win_sz);      % 选择海明窗

nfft = win_sz;
overlap = win_sz - 1;
[S, F, T,P] = spectrogram(y, han_win, overlap, nfft, fs);
subplot(2,1,2)  
imagesc(T, F, P)
set(gca, 'YDir', 'normal')
xlabel('Time (secs)')
ylabel('Freq (Hz)')
title('short time fourier transform spectrum')

在这里插入图片描述

【1】参考:http://www.360doc.com/content/16/0905/21/26322521_588657495.shtml

窗函数为
在这里插入图片描述

STFT的结果
在这里插入图片描述
此结果说明在此窗函数下时间分辨率比较好,但是频率率有一定厚度
当窗函数为

STFT变换的结果
在这里插入图片描述

频率分辨率比较好,但是时间分辨率比较差

猜你喜欢

转载自blog.csdn.net/qq_40168949/article/details/88425206