spectrogram-短时傅里叶变换

function[STFT_X,STFT_t,STFT_f]=myspectrogram(S,windows,nov,nfft,Fs)
tic,
%% S为输入语音片段,window为加的窗,nov为重叠点数,nff为采样点数fft,Fs为采样频率
L=length(S);
nsc=length(windows);%窗长
coln = fix((L-nov)/(nsc-nov));%分成片段数,列数
rown=floor(nfft/2)+1;  %行数

%%初始化变量
STFT_X0=zeros(nsc,coln); %分帧结果
index=1;%索引
%%分帧,加窗
index_L=nsc-nov; %窗移
for i=1:coln
    %分帧
    temp_S0=S(index:index+nsc-1,1);
    %加窗
    temp_S=temp_S0.*windows;
    %存到每一列
    STFT_X0(:,i)=temp_S(:,1);
    %将索引后移
    index=index+index_L;
end
STFT_X0=fft(STFT_X0,nfft,1);
%取一半
STFT_X= STFT_X0(1:rown,:);

%% 画频谱图
%%归一化
STFT_X1 = abs(STFT_X)/coln*2;

% convert amplitude spectrum to dB (min = -120 dB)
STFT_X1 = 20*log10(STFT_X1);  

%时间轴
nsc1=nsc/2;
nsc2=nsc-nov;
STFT_t=(nsc1:nsc2:nsc1+(coln-1)*nsc2)/Fs;
%频率轴
STFT_f=(0:rown-1)*Fs./nfft;

% plot the spectrogram
STFT_X1=STFT_X1';
figure
surf(STFT_f, STFT_t, STFT_X1);

shading interp
axis tight
box on
view(0, 90)
set(gca, 'FontName', 'Times New Roman', 'FontSize', 14)
xlabel('Frequency, Hz')
ylabel('Time, second')
title('Amplitude spectrogram of the signal')

handl = colorbar;
set(handl, 'FontName', 'Times New Roman', 'FontSize', 14)
ylabel(handl, 'Magnitude, dB')
toc

转载请注明出处:https://blog.csdn.net/qq_42263796/article/details/88558035

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
短时傅里叶变换(Short-Time Fourier Transform, STFT)是时频分析中常用的一种方法,它将信号分成多个短时窗口,分别进行傅里叶变换,然后将每个窗口的频谱拼接起来,得到整个信号的时频图。STFT的分帧过程如下: 1. 定义窗口函数:首先需要选择一个短时窗口函数,常用的窗口函数有汉宁窗、汉明窗等,窗口函数的长度一般为信号的采样点数的几个倍数。 2. 分帧:将原始信号分成多个短时窗口,每个窗口的长度为窗口函数的长度,相邻两个窗口之间有一定的重叠部分,一般重叠部分的长度为窗口长度的一半。分帧后的信号可以表示为: $x(n,m) = w(n)x(mR+n)$ 其中,$x(n,m)$为第m个窗口的第n个采样点,$w(n)$为窗口函数,$R$为帧移(即相邻两个窗口之间的间隔),一般取窗口长度的一半。 3. 傅里叶变换:对每个窗口进行傅里叶变换,得到每个窗口的频谱。 4. 拼接:将每个窗口的频谱拼接起来,得到整个信号的时频图。 MATLAB中可以使用stft函数实现STFT分析,具体操作如下: ``` % 读入音频文件,得到音频信号x和采样率fs [x,fs] = audioread('audio_file.wav'); % 定义窗口长度和帧移 win_length = round(0.02*fs); % 窗口长度(20ms) win_shift = round(0.01*fs); % 帧移(重叠长度为一半) % 计算短时傅里叶变换 spectrogram(x,win_length,win_shift,[],fs,'yaxis'); ``` 上述代码中,spectrogram函数的第一个参数为音频信号x,第二个参数为窗口长度,第三个参数为帧移(重叠长度),第四个参数为空,表示不进行窗口函数加权,第五个参数为采样率fs,第六个参数为'yaxis',表示在y轴上显示频率。函数执行后得到一个时频图,横轴表示时间,纵轴表示频率,颜色表示幅度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值