我在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 :(得分: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.
就像我说的那样,我试图将y轴数字放在彼此相邻的列中,将x轴放在行中。