1

我首先使用以下代码进行 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);
4

1 回答 1

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)

于 2014-12-23T13:44:48.043 回答