在进行FFT并获得Amp,Freq,Phase信息后创建音频文件

时间:2014-12-23 10:59:48

标签: matlab signal-processing fft ifft

我首先使用以下代码进行FFT,然后采用FFT的前10个更大幅度以及相应的频率和相位信息。

在代码结束时,我试图尽可能地重建原始信号但不使用ifft,因为我正在尝试实现。

最后,我试图编写.wav但是得到了太多的输出参数。"总是错误。 你能告诉我你的反馈吗?

close all
clear all
clc

[audio,Fs]=audioread('C:\Users\xaol\Desktop\sound.wma');
audioinfo('C:\Users\xaol\Desktop\sound.wma')
player=audioplayer(audio,44100); play(player)

length_audio=length(audio);
%plot(audio);

audio1=audio(2^16:2^17);   %taking a part of audio
audio_part=2^17-2^16;      %the lenght of taken part
plot(audio1);
title('original partly signal');
player=audioplayer(audio1,44100); play(player)

%% FFT

NFFT = audio_part;
Y = fft(audio1,NFFT)/length(audio1);
fs=length(audio1)/length(audio1);  
f = fs/2*linspace(0,1,NFFT/2+1);

[B,IX] = sort(abs(Y(1:NFFT/2+1))); %order the amplitudes
Amplitudes=B; %find all amplitudes 
Frequencies=f(IX(1+end-numel(Amplitudes):end)); %frequency of the peaks
Phases=angle(abs(Y));

%% 10 bigger amplitudes and corresponding frequency and phase are being found

A=B((length(IX)-9):(length(IX)));
F=Frequencies((length(IX)-9):(length(IX)));
P=angle(Y(IX((length(IX)-9):length(IX))))*180/pi;

FAP=[F;A;P]

%FAP is 3x10 matrix which includes frequency, amplitude and phase info

%% REBUILD ORIGINAL SIGNAL

ii=length(FAP);
org_audio=0;
t=0:length(audio1);

for i=1:1:ii
   org_audio=4*FAP(2,i)*exp(j*2*pi*FAP(1,i)*t+j*(pi/180)*FAP(3,i))+org_audio; 
end

figure, plot(t,org_audio)

audio_r1=abs(org_audio);
audio_r(:,1)=(audio_r1)';
audio_r(:,2)=audio_r(:,1);


filename='C:\Users\xaol\Desktop\sound2.wav';
AU=audiowrite(filename,audio_r,44100);

1 个答案:

答案 0 :(得分:3)

好吧,因为错误暗示你有“太多的输出参数”。通过查看您的代码,我认为问题是audiowrite不会返回任何输出参数(请查看http://www.mathworks.com/help/matlab/ref/audiowrite.html)。你应该使用

audiowrite(filename,audio_r,44100);

代替。
在任何情况下,您都应该学习如何使用MATLAB调试器(http://www.mathworks.com/help/matlab/debugging-code.html)来识别错误的位置。

顺便说一句,Phases = angle(abs(Y))行是有意义的,因为绝对值没有相位。您的意思是Phases = angle(Y)吗?