【发布时间】:2015-04-24 23:53:27
【问题描述】:
我在 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
最后,我希望能够使用 for 循环将我的整个信号分割成 mFrames(i) 和 vTimeFrame(i),但不要介意我什至无法让我的函数返回第一个(比如我说的是空矩阵)。
我知道我的段代码应该是正确的,因为我有另一个脚本使用相同的 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)。
【问题讨论】:
-
在我看来,您的方法中几乎没有不需要的东西,例如移帧和 frameNumber。 while循环的目的是什么?使用 vTimeFrames 来索引 vSignal。
-
就像我说过的那样,我会使用 for 循环来查看整个信号。要知道我必须换班多少次,我有 frameNumber 可以通过 while 循环计算出来。当然,当我查看不同的片段时,我将不得不改变我的起点,这就是为什么 frameShift: 所以 for 循环将是 for i=1:frameNumber (start=start+frameShift)