2015-04-24 57 views
0

我在Matlab中遇到了语法问题。将数组赋给函数中的矩阵,语法问题

我试图将音频信号分成不同的段(帧)。

我想将y轴值返回到矩阵(每个段都有自己的列)以及每个段具有其自己的行的相应时间值。

我什至不能让它返回只有一个单列和行对(即一帧)。我只是返回两个空矩阵。这是我的代码。

function [mFrames, vTimeFrame] = Framing(vSignal,samplingRate,frameLPerc,frameshPerc) 


totalTime=size(vSignal,1)/samplingRate 

frameLength = totalTime*frameLPerc; 
frameShift = totalTime*frameshPerc; 

frameNumber =0; 
check=frameLPerc; 

while check<1 
    check = check+frameshPerc; 
    frameNumber=frameNumber+1; 
end 

start = 1; 
% problem part 
    mFrames = vSignal(round((start:1/samplingRate:frameLength)*samplingRate)); 
    vTimeFrame = round((start:1/samplingRate:frameLength)*samplingRate); 

end 

在我想能够段我的整个信号转换成mFrames(i)和vTimeFrame(i)与一个for循环,不过没关系,我甚至不能让我的函数返回结束第一个(就像我说的空矩阵)。

我知道我的段码应该是正确的,因为我有另一个脚本具有相同vSignal(这是顺便说一列向量)的作品就好了工作(Y == vSignal):

voiced = y(round((1.245:1/Fs:1.608)*Fs)); 
plot(1.245:1/Fs:1.608,voiced) 

我标题为这与语法问题,因为我是非常新的matlab和习惯于Java。感觉非常奇怪,没有初始化任何东西,所以我不确定我的代码是否确实有意义。

测试时输入[m1,m2] = Framing(y,16000,0.1,0.05)。

+0

在我看来,你的方法中有很多不需要的东西,如帧移位和frameNumber。循环的目的是什么?使用vTimeFrames来索引vSignal。 – User1551892

+0

就像我说过的那样,我会用for循环来看整个信号。要知道我有多少次需要转换,我有frameNumber,它可以通过while循环来计算出来。当然,当我看着不同的细分市场时,我将不得不改变我的出发点,这就是为什么frameShift:for一个for循环将适用于i = 1:frameNumber(start = start + frameShift) – Nimitz14

回答

0

我明白了。

启动不在正确的域。这是正确的:

轮((启动/采样速率:1 /采样速率:帧长度)*采样速率)

当我积(M2,M1)我现在得到正确的答案。

虽然我还有其他问题,我怎样才能将这些段分配给我的矩阵?

for i=1:frameNumber 
    mFrames(:,i) = vSignal(round((start/samplingRate:1/samplingRate:frameLength)*samplingRate)); 
    vTimeFrame(i) = round((start/samplingRate:1/samplingRate:frameLength)*samplingRate); 

    start=start+frameShift; 
    frameLength=frameLength+frameShift; 

end 

我得到这个错误

In an assignment A(I) = B, the number of elements in B and I must be the same. 

就像我说的,我试图让彼此相邻并在行x轴列y轴的数字。