傅立叶变换的男女声音

时间:2014-11-13 22:15:23

标签: matlab signals fft

我正在使用matlab R2014a进行傅立叶变换,首先我读了两个女性和男性的音频文件,然后我初始化了每个的幅度和相位。我的报告中的任务要求将女性语音振幅与其他信号 - 男性阶段的相位谱混合,或者反之亦然,所以我写了一个代码并且我不断收到此错误:

Error using  * 
Inner matrix dimensions must agree.
out1 = Mag_Male*exp(1i*Phase_Fem);

甚至使用。*

Error in Untitled9 (line 183)
out1 = Mag_Male.*exp(1i*Phase_Fem);
两个运营商中的

或。*

完整错误

>> Untitled9
Error using  .* 
Matrix dimensions must agree.
Error in Untitled9 (line 183)
out1 = Mag_Male.*(exp(1i.*Phase_Fem));

使用尺寸函数输出m和f尺寸

代码:

maleAudio_row = size(m);
femaleAudio_row = size(f);
display(maleAudio_row);
display(femaleAudio_row);

输出:

maleAudio_row =

  119855           2

femaleAudio_row =

  119070           1

虽然我的其他同事和他们一起工作得很好:(

这是我的代码:

Fs = 11025;
Ts = 1/Fs;
t = 0:Ts:0.1;
[m, Fs]=audioread('hamid1.wav');
[f, Fs]=audioread('myvoice.wav');
player = audioplayer(m,Fs);
player2 = audioplayer(f,Fs);
%play(player2);
%---- Frquency Domain Sampling-----%
Fem = fft(f);
Phase_Fem = angle(Fem);
Mag_Fem = abs(Fem);
%-----------------------------------%
Male = fft(m);
Mag_Male = abs(Male);
Phase_Male = angle(Male);
%-----------------------------------%
out1 = Mag_Male*exp(1i*Phase_Fem); % this step for putting female phase on male  mag.
out2 = ifft(out1); % this step is convert the previus step to time domain so i can     
%play the audio
Nx = length(out2);
F0 = 1/(Ts*Nx2);
result = audioplayer(out2); 
play(result);

2 个答案:

答案 0 :(得分:0)

如果使用*,它将尝试进行矩阵乘法。你可能想要使用的是元素运算符元素,它是一个元素。之前 *。这会将向量中的第一个元素与另一个向量中的第一个元素相乘,第二个元素与第二个元素相乘,等等。

out1 = Mag_Male.*exp(1i*Phase_Fem);

这假设您的FFT结果长度相同。如果原始样本的长度相同,则会出现这种情况。

答案 1 :(得分:0)

你的hamid1.wav'是双通道的wav文件,而myvoice.wav'是一个通道的wav。如Matlab手册(http://nl.mathworks.com/help/matlab/ref/audioread.html

中所述
  

文件中的音频数据,以m-by-n矩阵形式返回,其中m是读取的音频样本数,n是文件中音频通道的数量。

只需将m转换为一个通道,因为m = 0.5 *(m(:,1)+ m(:,2)),调整其他维度并使用。* product(如评论中建议的那样)。

clear all; 
m = randn(1000,2); %dummy signal
f = randn(999,1); %dummy signal
N = min(size(m,1),size(f,1));

Male = fft(0.5*(m(1:N,1)+m(1:N,2)));
Fem = fft(f(1:N,1));

Mag_Male = abs(Male);
Phase_Male = angle(Male);

Phase_Fem = angle(Fem);
Mag_Fem = abs(Fem);

out1 = Mag_Male.*exp(1i*Phase_Fem);