% 绘制原始信号和重建信号 figure; subplot(2,1,1); % 将mtlb中的所有元素除以mtlb的最大绝对值,以将向量归一化为[-1,1]的范围 plot(mtlb/max(abs(mtlb)),'b');grid on;title('signal of mtlb'); subplot(2,1,2); window_length=1024;%窗长 N=512;%512点DFT sign_large=1024;%语音帧的大小 sign_in=mtlb;L=length(sign_in); window=hann(window_length);Mod=sign_large-mod(L,sign_large);%对L取反 Q=(L+Mod)/sign_large; sign_in=[sign_in;zeros(Mod,1)]/max(abs(sign_in));%归一化 X=zeros(sign_large,(N/2+1));Z=zeros(window_length-1,(N/2+1)); t=(0:sign_large-1)'; window1=zeros(sign_large,(N/2+1)); window2=zeros(sign_large,(N/2+1)); for k=1:(N/2+1) w=2*pi*1j*(k-1)/N; window1(:,k)=exp(-w*t); window2(:,k)=exp(w*t); end for p=1:Q R=sign_in((p-1)*sign_large+1:p*sign_large); for k=1:(N/2+1) x=R.*window1(:,k); [X(:,k),Z(:,k)]=filter(window,1,x,Z(:,k));%加窗滤波后进行STFT变换 end X1=X.*window2; A=zeros(sign_large,1); for j=2:(N/2) A=A+X1(:,j); end Y((p-1)*sign_large+1:p*sign_large)=2*real(A)+real(X1(:,1)+X1(:,65));%求和 end sign_out=Y(1:L)/max(abs(Y)); figure(3); plot(sign_out);
时间: 2023-06-16 15:06:50 浏览: 117
利用Matlab绘制正弦信号的频谱图并做相关分析(幅值修正).doc
这段代码实现了对原始信号进行STFT分析,然后对分析结果进行重建,最后绘制出原始信号和重建信号。具体步骤如下:
1. 对原始信号进行归一化处理,使其数值范围在[-1,1]之间。
2. 定义了一个1024点的汉宁窗口,并将语音帧的大小设置为1024。
3. 将原始信号分帧,每帧大小为512,然后进行加窗滤波和STFT变换,得到频域的分析结果。
4. 对STFT分析结果进行重建,具体做法是将所有频域分量的实部相加,然后加上直流分量和Nyquist分量的实部。
5. 对重建信号进行归一化处理,使其数值范围在[-1,1]之间。
6. 最后用plot函数绘制出原始信号和重建信号的图像。
需要注意的是,这段代码中使用了一些循环和滤波操作,对于理解代码的具体实现细节可能需要有一定的信号处理和数字信号处理基础。
阅读全文