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 に答える