【问题标题】:Analyse and cancel common frequency of wave file分析和取消wave文件的常用频率
【发布时间】:2017-07-24 07:49:41
【问题描述】:

我正在处理音频但卡住了。我有一个视频文件,我首先将其转换为 .wav 文件。实际上我只需要提取人声部分。我所做的是我能够删除人声部分,只删除背景声音。这意味着我现在有两个文件,一个是主文件,另一个是音乐文件,即 Karoake 文件。两者的文件采样率相同。我打算这样做是为了比较文件,只要主文件和卡拉OK文件在完全相同的时间,如果两者都相同,就会给出零。在这个过程中,我只能提取人声部分。我是 octave 和 matlab 的新手。我正在附上我迄今为止的工作。

[wave,fs]=wavread('music.wav');
[wave1,fs1]=wavread('sound.wav');
t=0:1/fs:(length(wave)-1)/fs;
t1=0:1/fs1:(length(wave1)-1)/fs1;
for x=0:length(wave)
  if (wave{x}==wave1{x})
   wave2{x}=wave{x}-wave1{x};
else
  endif
endfor

for 循环显示错误。

编辑:好的,我问的问题实际上不是问题。我想要的是只提取音频文件的人声部分。

【问题讨论】:

  • 错误是什么?
  • 错误:不能用 { 索引矩阵
  • 同样的问题:stackoverflow.com/questions/45207376/vocal-of-an-audio-file你不需要for循环只需计算差异:wave2 = wave2 - wave;这当然假设music.wav和sound.wav的采样率和长度是一样的
  • 顺便说一句,如果你想在 Octave 中做,为什么会有 python 标签?
  • @AtanuMandal 你不应该为每一个小小的“更新”创建一个新问题。差异很小,您甚至还没有回答上一个问题的 cmets 中的问题。

标签: python matlab audio signal-processing octave


【解决方案1】:

在 Matlab(或 Octave)中,您只能用“()”索引矩阵。此外,Matlab 中的起始索引是 1,而不是像 C 或 Java 中的 0。所以我认为你的代码必须是正确的:

for x=1:length(wave)
  if (wave(x)==wave1(x))
   wave2(x)=wave(x)-wave1(x);
end

您还可以通过使用一些数组乘法来删除 for 指令:

wave2 = (wave - wave1).*(wave1==wave);

【讨论】:

  • 也许你应该重新考虑你的最后一个公式。 wave - wave1 wave1==wave 是什么?
  • 是的,它等于0,但我只是将他的for语句翻译成矩阵乘法。
  • 好的,我明白了,但我需要提取人声。如果两个文件在某个时间具有相同的频率,则将频率设为 0。结果还没出来。
  • 你能解释一下这个 wave2 = (wave - wave1).*(wave1==wave);
  • (wave1 == wave) 是一个与wave1(和wave)长度相同的数组,它只包含01。由 n 索引的元素等于 1 if wave1(n) == wave(n) else 0。此外,逐元素乘法.* 用于逐个元素进行乘法运算,而不是矩阵乘法。所以这个表达式是一个数组,如果wave1(n) != wave(n) 等于0,如果wave1(n) == wave(n) 等于wave(n) - wave1(n)(正如安迪所说,这也是'0')。
猜你喜欢
  • 2014-05-23
  • 1970-01-01
  • 2015-07-16
  • 1970-01-01
  • 2017-01-31
  • 2011-05-17
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多