【问题标题】:Matlab code to C# code conversionMatlab代码到C#代码的转换
【发布时间】:2026-02-17 15:15:01
【问题描述】:
   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;

【问题讨论】:

  • 我们需要知道speech 是什么。
  • 语音应该是整数列表。

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


【解决方案1】:

代码采用一个表示信号的数组。然后根据指定长度的窗口将其分解为多个片段,计算每个片段中的能量,并找出哪些片段的能量高于某个阈值。

让我们更详细地看一下代码:

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))';

【讨论】:

  • 非常感谢 Amro,但我还有两个问题。 x 不是数组的一部分,[] 是什么意思?我知道它等于窗口的语音长度,但它到底在做什么?
  • 这只是一个示例,向您展示如何将数组重塑为矩阵,每列中有 4 个值,x 应该是 speech。使用reshape 时,如果您将[] 指定为维度之一,您就是在告诉MATLAB 自动计算它(毕竟在整形时所有元素的数量都不会改变)。
  • 我已从文件中读取字节并将其存储到一个列表中,然后我在 c# 中使用了list.GetRange(0,(list.Count - (list.Count % window)));。现在我要确定samples 使用一种等效于重塑的方法。我希望我能处理好这个。 :) 再次感谢您的回答。
【解决方案2】:
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)

【讨论】:

  • 感谢您的回复。它看起来是正确的,但你为什么要写 //speech = speech(1:r,1)。这是什么意思?
  • 要运行此代码,我应该在 matlab 中打开 .wav 文件。 [s,fs]=audioread('1_h_1.wav'); 使用此代码打开 1_h_1.wav 文件。然后我有两个输出s和fs。 fs 取值 = 1600,当我绘制 s 时,我看到了一个波形。
【解决方案3】:

这个:

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

是一个公式

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

那就试试吧

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

% 是等同于mod(..) 的符号

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

【讨论】:

  • 断章取义我不知道。看起来speech 是一种方法,这些是传递给它的参数...根据您在问题下的评论,它将整数列表中的一个分配给变量