首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将语音频谱转换为时域

如何将语音频谱转换为时域
EN

Stack Overflow用户
提问于 2014-04-06 06:53:21
回答 2查看 907关注 0票数 0

我在做语音分析。我把声音录了5秒。应用Hamming窗,直流偏移和归一化,并使用fft的频谱。我想知道声音有多大变化。那么,有没有办法将fft转换回时域呢?

代码语言:javascript
复制
clc,clear;
% Record your voice for 5 seconds.
%recObj = audiorecorder;
recObj = audiorecorder(96000, 16, 1);
disp('Start speaking.')
recordblocking(recObj,5);

disp('End of Recording.');
% Play back the recording.
play(recObj);
get(recObj);
myspeech = getaudiodata(recObj);
wavwrite(double(myspeech),96000,'C://Users//naveen//Desktop//unprocessed')

% Store data in double-precision array.
myRecording = getaudiodata(recObj);

% Store data in double-precision array.
myRecording = getaudiodata(recObj);

% Plot the samples.
figure,plot(myRecording),title('Original Sound');
%Offset Elimination
 a = myRecording;
 a=double(a);
 D = a-mean(a);
 figure,plot(myRecording),title('Sound after Offset Elimination');

 %normalizing
 w = D/max(abs(D));
 figure,plot(w),title('Normalized  Sound');

 %      hamming window 
 a1=double(w);
 %a1=a1';
 N=length(w);
 hmw = hamming(N);
 temp = a1.*hmw;
 a1 = temp;

 %Fast Fourier Transform 
 a2=double(a1);
 N=length(a1);
 n=ceil(log2(N));
 nz=2^n;
 fs = 96000;
 x_z=0*[1:nz];
 x_z(1:N)=a2;
 X=fft(x_z);
 x1=abs(X);
 wq=double(0:nz-1)*(fs/nz);
 figure,stem(wq,x1),title('Spectrum');    
 xlabel('Frequency (Hz)');
 ylabel('Magnitude of FFT Coefficients');

 nz1=round(nz/2)
 x2=x1(1:nz1);
 w1=wq(1:nz1);
 figure,plot(w1,x2);
 title('Half Length Spectrum of Sound');
 nz2=nz1*10;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-06 08:32:46

fft一样,您也可以应用ifft,这是傅里叶变换(http://www.mathworks.es/es/help/matlab/ref/ifft.html)的逆。

票数 0
EN

Stack Overflow用户

发布于 2014-04-06 16:06:26

对复杂数据使用abs()函数是一种有损操作,它丢弃任何阶段信息。相位信息对FFT窗口中的波形形状和任何瞬态的定时进行编码。由于这些信息已经被丢弃,光是一个震级谱或谱图就不能被转换回听起来像原始语音的音频。

但是,如果保持FFT的全部复结果,那么复IFFT可能会用于某种再合成过程。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22890919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档