MATLAB中的specgram函数可以用来绘制语谱图么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中的specgram函数可以用来绘制语谱图么相关的知识,希望对你有一定的参考价值。

急用

参考技术A 那是做功率谱的 参考技术B nff 是FFT变换的系数长度,比如1024,window是X的分帧长度,要小于或者等于nff,一般等于nff,
overlap是帧重叠的长度,要<= 1/2 * nff, 取1/4 * nff 就可以了。
参考技术C 可以做语谱图

分别使用specgram函数和tftb工具箱对信号进行STFT短时傅里叶时频分析matlab仿真

up目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

       傅里叶变换只反映出信号在频域的特性,无法在时域内对信号进行分析。为了将时域和频域相联系,Gabor于1946年提出了短时傅里叶变换(short-time Fourier transform,STFT),其实质是加窗的傅里叶变换。STFT的过程是:在信号做傅里叶变换之前乘一个时间有限的窗函数 h(t),并假定非平稳信号在分析窗的短时间隔内是平稳的,通过窗函数 h(t)在时间轴上的移动,对信号进行逐段分析得到信号的一组局部“频谱”。信号的短时傅里叶变换定义为:

        然而,傅里叶变换是一种全局的变换,时域信号经过傅里叶变换后,就变成了频域信号,从频域是无法看到时域信息的,我们可以从上节中的傅里叶变换和反变换公式进行解释,进行正变换时,积分区间为整个时域,所以变换结果将不包含时域信息,反变换同理。

       如果信号的频率特性在任何时间都不发生改变(即该信号是平稳信号)的话,使用傅里叶变换是没有问题的,然而如果该信号是非平稳信号,这时候时域信息就相当重要了。举个栗子,以下分别是0~100Hz线性递增扫频信号和100~0Hz线性递减扫频信号的幅度谱,这两个信号都是非平稳信号,可以看到它们的幅度谱是相同的,很显然我们无法知道每一个频率分量出现的时间,即无法知道扫频信号的模式。

       分析时域可以得到信号随时间变化的信息,分析频域可以得到信号随频率变化的信息,这两者都只能分析时域或频域,而不能同时观察时域和频域。

        时频分析是时频联合域分析的简称,是分析时变非平稳信号的有力工具,是一个同时观察时域、频域信息的工具。时频分析法提供了时间域和频率域的联合分布信息,清楚地描述了信号频率随时间变化的关系。

        时频分析的基本思想是:设计时间和频率的联合函数,用它同时描述信号在不同时间和频率的能量密度或强度。

        时间和频率的这种联合函数简称为时频分布。利用时频分布来分析信号,能给出各个时刻的瞬时频率和幅值。

        常见的时频分布有:短时傅里叶变换、小波变换、希尔伯特黄变换等。

其中,STFT理论如下所示:

二、核心程序

%这是一个利用tfrstft函数进行STFT分析的程序
%生成两个chirp信号,一个频率由小变大,另一个由大变小,将两者相加,求其STFT时频谱
clc;
clear;
close all;
warning off;
addpath(genpath(pwd));
t=0:0.001:1.024-.001;
N=1024;
%两个chirp信号,并相加:
y1=chirp(t,0,1,350);
y2=chirp(t,350,1,0);
y=y1+y2;
%求两个chirp信号的短时傅里叶变换;
ym=y';
tfrstft(ym);
function [tfr,t,f] = tfrstft(x,t,N,h,trace);
 
[xrow,xcol] = size(x);
if (nargin < 1),
 error('At least 1 parameter is required');
elseif (nargin <= 2),
 N=xrow;
end;

hlength=floor(N/4);
hlength=hlength+1-rem(hlength,2);

if (nargin == 1),
 t=1:xrow; h = tftb_window(hlength); trace=0;
elseif (nargin == 2) | (nargin == 3),
 h = tftb_window(hlength); trace = 0;
elseif (nargin == 4),
 trace = 0;
end;

if (N<0),
 error('N must be greater than zero');
end;
[trow,tcol] = size(t);
if (xcol~=1),
 error('X must have one column');
elseif (trow~=1),
 error('T must only have one row'); 
elseif (2^nextpow2(N)~=N),
 fprintf('For a faster computation, N should be a power of two\\n');
end; 

[hrow,hcol]=size(h); Lh=(hrow-1)/2; 
if (hcol~=1)|(rem(hrow,2)==0),
 error('H must be a smoothing window with odd length');
end;

h=h/norm(h);

tfr= zeros (N,tcol) ;  
if trace, disp('Short-time Fourier transform'); end;
for icol=1:tcol,
 ti= t(icol); tau=-min([round(N/2)-1,Lh,ti-1]):min([round(N/2)-1,Lh,xrow-ti]);
 indices= rem(N+tau,N)+1; 
 if trace, disprog(icol,tcol,10); end;
 tfr(indices,icol)=x(ti+tau,1).*conj(h(Lh+1+tau));
end;
tfr=fft(tfr); 
if trace, fprintf('\\n'); end;

if (nargout==0),
 tfrqview(abs(tfr).^2,x,t,'tfrstft',h);
elseif (nargout==3),
 if rem(N,2)==0, 
  f=[0:N/2-1 -N/2:-1]'/N;
 else
  f=[0:(N-1)/2 -(N-1)/2:-1]'/N;  
 end;
end;

三、测试结果

使用matlab2021a仿真测试结果如下所示:

up0007

以上是关于MATLAB中的specgram函数可以用来绘制语谱图么的主要内容,如果未能解决你的问题,请参考以下文章

matlab中的bar函数怎么用

pyplot绘制常见图表

在 Audacity 中绘制波谱

matlab中图像显示函数

MATLAB | 全网唯一,使用MATLAB绘制精致的环形树状图

MATLAB | 全网唯一,使用MATLAB绘制精致的环形树状图