Matlab代码转换为C#代码

时间:2013-09-13 11:55:48

标签: c# matlab signal-processing code-conversion

   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;

3 个答案:

答案 0 :(得分: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”值是第二个段,依此类推..

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

energies = sqrt(sum(samples.*samples))';

答案 1 :(得分: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)

答案 2 :(得分:0)

此:

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

是一个公式

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

所以试试

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

%是等同于mod(..)

的符号

编辑我应该说我认为这是你代码中的mod(..):)