我在这里问了这个问题:.wav 信号的音频分离,但不清楚,所以,这是我的第二次尝试:
首先,假设我有一个包含如下句子的 .wav 文件:
“我的名字是迈克尔”我想从中提取以下内容:
“我的”-> 音素 (1)
“名称”-> 音素 (2)
“是” -> 音素 (3)
“迈克尔”-> 音素 (4)
这意味着我已经获取了我的 1D 信号,并将其拆分为包含这些特定单词/音素的 2D 信号(向量),然后我可以对其进行分析和识别。因此,我想在时域而不是频域中计算它。再次澄清一下:
我接收一个包含一个句子的一维信号,将这个句子分成包含这个数据的不同部分:vect[0], vect[1]
,....vect[4]
假设在matlab中我做了以下命令wavwrite(vect[0], ....)
,然后它会输出单词“My”并将所有块一起会给我完整的句子。
这是我的“现实世界问题”而不是音素,我有 bat call,每个 bat call 的长度在这个阶段是未知的。但这里是一个典型的 bat 调用示例:在这里,对于这些 bat 调用中的每一个,这些都需要与输入的信号分离并存储在一个向量中(就像上面的示例一样),然后允许我识别每个蝙蝠并对其进行分析。
这就像,样本会给我一个包含每个蝙蝠调用的 2D 向量:“Bat1”,“Bat2”......“Bat[n]” 蝙蝠被记录的时间量是未知的,或者,因此每个 bat 调用的长度是多少。
到目前为止我做了什么:
我已经获得了蝙蝠信号,对其进行了处理,并得到了以下信息(已绘制):
我还使用以下公式强调了信号:
rawSignal[i] = rawSignal[i] - (0.95 * rawSignal[i-1]);
然后我使用以下方法压缩了信号:
float param = 1.0;
for(unsigned i=0; (i < rawSignal.size()); i++)
{
int sign = getSignOf(rawSignal[i]);
float norm = normalise_abs_value(rawSignal[i]);
norm = 1.0 - pow(1.0 - norm, param);
rawSignal[i] = denormalize_value(norm, sign);
}
然后给我以下输出:
我不清楚从这个信号中识别单个元素(“调用”)应该从哪里开始。因为,如果我使用过零和/或计算信号的总能量并因此使用阈值,那么它只会去除噪声,我会得到信号的压缩版本。
与某人交谈时,他们建议我应该尝试使用它,Cochleagram domain
但是,我对此并不熟悉,并且对此可用的研究很少。
如果有人有任何建议,或者我可以使用的算法,请提出建议。