2017-03-08应该是我在把经过傅立叶面变化的至在前的数据没有进行分帧,全部带入造成数据过大。
现在毕设还在继续,以后有空我重新把分帧假如并测试调用频域到时域的这段代码的调用(下面的是我自己的想法,结果可能是错误的。存档使用)
没有测试,担心会宕机,
题外话利用matlab自带工具(这里代码与这里无关)
时域通过fft 得到频域;
频域通过ifft得到时域;
wav波形数据块,通过加窗(不经加窗测试可用),在经过fft得到复数形式,而后画图得到频域图;
频域数据复数(a+bi)在没有经过变换的时候,用ifft,能够得到wav波形数据,sound(data);测试成功。
根据文献,自己写的频域到时域,测试一次,电脑内存99%,宕机了,所以强制关机重启,不想测试了
代码贴后头,文库文章链接可接着更改。
http://wenku.baidu.com/view/39725f0f8e9951e79b89277f
个人猜想源wav 改变采样频率为outfs,采样数据为outN。可能会宕机,接着测试需谨慎。我看的文献改变采样频率的,
有时域加点,频域收缩扩展。
我是想利用获得时域得到频域,而频域获得构造的波形函数,然后采样点数通过构造的波形函数自己取点。
这里代码没有测试成功,也不知道如果用这个思路出来的语音是否有异变
function [y,fs]=fa2ta(f_a_bi,outN,outfs)
%由频域到时域
a_bi=f_a_bi;
nN=outN;
nfs=outfs;
i=0:nN-1;
fn(1:nN,1)=i*nfs/nN;%
fn(1,1)=1;
SHIBU=real(a_bi);
XUBU=imag(a_bi);
an=2*sqrt(a_bi.* conj(a_bi))./nN;
%直流幅度an(1,1)=SHIBU(1,1)/nN;
pn=atan2(XUBU,SHIBU);%初相位
syms tnn;
ann=an(2:nN,1);
fnn=fn(2:nN,1);
pnn=pn(2:nN,1);
ycos=sym(sum(ann.*cos(tnn.*fnn*2*pi+ pi.*pnn./180),1));
ycos=ycos+a(1,1);
fs=nfs;
t=0:1/outfs:outN-1/outfs;%新采样个数outN
y=double(subs(ycos,tnn,t));
%绘一半即0~Nyquist
subplot(2,2,3);
plot(t,y);
xlabel('时间');
ylabel('振幅');
title('时域');
end