如何使用matlab将语谱图恢复成音频?

如题,可以说说使用matlab里的什么函数,或是什么方法,最好有代码,急用!万分感谢!

【语谱图的matlab提取】


[x,Fs,nBits]=wavread('audio.wav');

s=length(x);    % 信号长度
w=256;            % 窗长
n=w;            % nfft,表示做fft变换需要的点数,一般为刚大于w的2的幂。举例,w=250,则n一般设为256
ov=w/2;            % 分帧的交叉程度,常见设为窗长的二分之一或四分之一
h=w-ov;            % 不重叠点数
win=hamming(n)';% 选了常见的汉明窗,并设置nfft
c=1;            % 指向当前帧的指针
ncols=1+fix((s-n)/h);    % 计算总共有多少帧
d=zeros((1+n/2),ncols);    % 语谱图初始化

for b=0:h:(s-n)    % 以下处理各帧
    u=win.*x((b+1):(b+n));    % 各帧加窗
    t=fft(u,n);                % 各帧进行fft,内容为u,nfft=n。对于fft,输入n个时域点,输出n个频域点
    d(:,c)=t(1:(1+n/2))';    % 并联频谱向量,注意只取1+n/2,因为负频率无意义,只留下0和正频率
    c=c+1;        % 移动指针
end
tt=[0:h:(s-n)]/Fs;    % 时间轴
ff=[0:(n/2)]*Fs/n;    % 频率轴

imagesc(tt/1000,ff/1000,20*log10(abs(d)));    % 绘制
colormap(hot);
axis xy
xlabel('时间/s');
ylabel('频率/kHz');


利用MATLAB中的wavread命令来读入(采集)语音信号,将它赋值给某一向量,参考链接:https://blog.csdn.net/tobefans/article/details/125429377

另外,这里最后提供一个应用MatLab对语音信号进行处理的笔记,供你参考,笔记讲述详细,注解清晰,应该可以有效的帮助你加深理解,祝你学有所成:
https://zhuanlan.zhihu.com/p/57902993

[x,Fs,nBits]=wavread('audio.wav');

s=length(x); % 信号长度
w=256; % 窗长
n=w; % nfft,表示做fft变换需要的点数,一般为刚大于w的2的幂。举例,w=250,则n一般设为256
ov=w/2; % 分帧的交叉程度,常见设为窗长的二分之一或四分之一
h=w-ov; % 不重叠点数
win=hamming(n)';% 选了常见的汉明窗,并设置nfft
c=1; % 指向当前帧的指针
ncols=1+fix((s-n)/h); % 计算总共有多少帧
d=zeros((1+n/2),ncols); % 语谱图初始化

for b=0:h:(s-n) % 以下处理各帧
u=win.*x((b+1):(b+n)); % 各帧加窗
t=fft(u,n); % 各帧进行fft,内容为u,nfft=n。对于fft,输入n个时域点,输出n个频域点
d(:,c)=t(1:(1+n/2))'; % 并联频谱向量,注意只取1+n/2,因为负频率无意义,只留下0和正频率
c=c+1; % 移动指针
end
tt=[0:h:(s-n)]/Fs; % 时间轴
ff=[0:(n/2)]Fs/n; % 频率轴
imagesc(tt/1000,ff/1000,20
log10(abs(d))); % 绘制
colormap(hot);
axis xy
xlabel('时间/s');
ylabel('频率/kHz');

如果你只是真的只有论文中某张语谱图的图片的话,当然是不行,必须要有具体的语谱图数据来做逆变换;而且理论上讲,由于正变换时进行了时域加窗截断,频域上进行了卷积,每一种窗都对应一种窗函数以及频域H(e^jw),所以你还需要知道这张语谱图用的是何种窗函数,正变换时分了多少帧,才能进行解卷积,只能说是很困难,语谱图一般只是为了方便观察频域和时域对应的能量变化,并不具备恢复原始音频的目的。