【问题标题】:How to make MATLAB play an array faster?如何让 MATLAB 更快地播放数组?
【发布时间】:2013-04-29 10:53:49
【问题描述】:

我正在开发一个音频处理器,它应该在歌曲播放时改变音高并为歌曲添加颤音。请注意,虽然声音不是实时的(例如来自麦克风),但我想要添加的效果是实时的。

我发现处理它的最佳方法是将声音文件分成小元素并按顺序对每个元素应用效果。

所以我写了这个来分割音频文件:

%Load Sound File
[fsample Fs] = wavread ('C:\Users\Ogulcan\Desktop\Bitirme Projesi\Codes\kravitz.wav'); 


%length of the sample
t=length(fsample);
%number of samples
ns=10;
%Defining the array:
A=[];


%Create the vectors and place them into the array 'A':

for i=1:ns-1
   v=fsample(i*t/ns:(i+1)*t/ns);
   A=[A;v];
end

这段代码工作并将声音分成 10 个样本,但是当我尝试循环播放它们时,会有一个小但明显的延迟。现在我计划对更大的样本数量进行此操作。

谁能帮我解决这个速度问题?除了 MATLAB,我真的不知道任何其他语言,也没有所需的软件,所以如果你能告诉我一种在 MATLAB 中执行此操作的方法,我将不胜感激。

【问题讨论】:

  • Matlab 是解释型语言,所以循环很慢。这可能是原因。但是,您可以发布用于播放示例的代码吗?
  • 我不认为这与循环的速度有关。我认为这是wavplay/audioplayer 在尝试背靠背播放两个样本时的问题。
  • @EitanT 是对的:仅使用循环和 MATLAB 的基本声音功能无法正确执行此操作。我相信Psychtoolbox 有声音功能,可以让你更直接地写入音频流,这应该可以让你做你想做的事。

标签: arrays performance algorithm matlab audio-processing


【解决方案1】:

您可以将整个循环替换为以下更简单的 sn-p:

A = fsample(1:end-rem(length(fsample),ns));  % ensure data has ns full samples
A = reshape(A,[],ns)';

【讨论】:

  • 虽然这确实是一种更优雅的创建 A 的方式,但我怀疑问题在于各种样本的实际背靠背播放。
  • @Yair 我尝试了你的建议,但是我收到一条错误消息,上面写着 Product of known dimension, 10, not dividible into total number of elements, 328042. 有谁知道为什么会发生这种情况以及我该如何解决?先感谢您。 (我希望这是回复我看不到回复按钮的cmets的方式)
  • 这就是第一行的用途 - 确保 A 具有可去除的元素数量而没有余数,以便您可以安全地将其重塑为矩阵。在您的情况下,A 将有 328040 个元素(最后 2 个将被丢弃)。
猜你喜欢
  • 2021-08-16
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多