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),删除最后一个值。

下一行是:

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”值是第二段,依此类推..

最后,下一行是计算每个段中的信号能量(以矢量化方式)。

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 回答