0
   function [ samples,y, energies] = energy( speech, fs )
   window_ms = 200;
   threshold = 0.75;

   window = window_ms*fs/1000;
   speech = speech(1:(length(speech) - mod(length(speech),window)),1);
   samples = reshape(speech,window,length(speech)/window);
   energies = sqrt(sum(samples.*samples))';

   vuv = energies > threshold;
   y=vuv;

この matlab コードがあり、このコードを c# で記述する必要があります。しかし、コードの最後の部分が理解できませんでした。また、コードの最初の部分によると、スピーチはデータリストまたは配列に対応すると思います。そうでない場合は、誰かがこのコードが何をしているのか説明してください。ロジックを知りたいだけです。fs = 1600 または 3200;

4

3 に答える 3

2

このコードは、信号を表す配列を取ります。次に、指定された長さのウィンドウに従って断片に分割し、各セグメントのエネルギーを計算し、特定のしきい値を超えるエネルギーを持つセグメントを見つけます。

コードを詳しく見てみましょう。

speech = speech(1:(length(speech) - mod(length(speech),window)),1);

上記の行は基本的に、入力信号の長さがウィンドウの長さの倍数であることを確認しています。たとえばspeech、11 個の値の配列で、ウィンドウの長さが 5 の場合、コードは最初の 10 個の値 (1 から 5*2 まで) のみを保持し、最後の残りの 1 個の値を削除します。

次の行は次のとおりです。

samples = reshape(speech,window,length(speech)/window));

おそらく、簡単な例で最もよく説明されています。

>> x = 1:20;
>> reshape(x,4,[])
ans =
     1     5     9    13    17
     2     6    10    14    18
     3     7    11    15    19
     4     8    12    16    20

そのため、配列を "k" 行 (k はウィンドウの長さ) の行列に再形成し、配列を完成させるために必要な数の列を作成します。したがって、最初の "K" 値が最初のセグメントになり、次の "k" 値が 2 番目のセグメントになり、以降も同様です。

最後に、次の行では、各セグメントの信号エネルギーを (ベクトル化された方法で) 計算しています。

energies = sqrt(sum(samples.*samples))';
于 2013-09-14T12:06:29.890 に答える
1
List<int> speech = new List<int>();

int window = 0;

int length = speech.Count();

int result = length % window;

int r = length - result;

// speech = speech(1: r, 1)
于 2013-09-13T12:09:22.700 に答える
0

これ:

(length(speech) - mod(length(speech),window)

式です

([length of speech] - [remainder of (speech / window)])

だから試してみてください

(length(speech) - (length(speech) % window))

%は記号と同等ですmod(..)

編集私はそれがmod(..)あなたのコードにあると仮定していると言わなければなりません:)

于 2013-09-13T11:59:24.987 に答える