2015-04-24 152 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軸的數字。