Octave 从函数播放音频文件的倍频程
我想写一个函数,将音频文件地址作为输入,然后对该音频文件进行一些更改并播放它 我是Octave新手,通过查看文档,我得到了下面的代码Octave 从函数播放音频文件的倍频程,octave,Octave,我想写一个函数,将音频文件地址作为输入,然后对该音频文件进行一些更改并播放它 我是Octave新手,通过查看文档,我得到了下面的代码 function main % clear screen clear; clc; audio_src_address = 'introduction.wav'; NegateAudioPhase(audio_src_address); endfunction; function NegateAudioPhase (aud
function main
% clear screen
clear;
clc;
audio_src_address = 'introduction.wav';
NegateAudioPhase(audio_src_address);
endfunction;
function NegateAudioPhase (audio_src_address)
% load audio source
[y, fs] = audioread(audio_src_address);
% use chanel 1
y = y(:,1);
% audio frequency domain
f = fft(y);
m = abs(f);
p = angle(f);
% negate audio source phase
p = -p;
% calculate new fourier transform
f = m .* exp(j*p);
% create the new audio source
y2 = ifft(f);
% play audio sound
player = audioplayer(y2, fs);
play(player);
endfunction
我已将此代码放入main.m
文件中。
我使用Octave CLI通过键入main
并按enter键来运行代码
代码将一直运行到结束,但不会播放音频。
执行后,命令行中出现警告:
warning: Octave:audio-interrupt
warning: called from
main>NegateAudioPhase at line 33 column 1
main at line 6 column 5
我将所有代码都放在了另一个文件中,没有定义任何函数,它按预期工作。好的,我找到了解决问题的方法。
正如前面提到的,问题似乎是当函数返回时(到达
endfunction
)播放器对象被破坏。所以我想我可以等待音频文件完成
所以我在播放音频后添加了下面的代码
% wait to finish
while(isplaying(player))
% Waiting for sound to finish
endwhile
结果一开始是我想要的 使用功能
playblocking
而不是play
,等待播放完成。请参阅。尝试从函数中返回“player”,以便在返回后不会将其删除。因此,您说player是一个局部变量,并且在返回函数时会被取消控制,因为player位于函数的堆栈内存中。对我来说是有道理的。你已经试过了吗?你函数的第33行是“endfunction”吗?。顺便说一句,如果您在行号方面出现警告或错误,您应该在代码中添加注释,注释行号对不起,耽搁了。我很忙。我只是试了一下,但令人惊讶的是,它没有起作用。可能是因为main被返回,而object被销毁。我想我应该找到一种方法,在返回之前等待音频完成。对不起,行编号问题。是的,您右边的第33行是文件末尾的endfunction
。我确信您犯了一些错误,但没有向我们显示完整的(修改的)内容,这是不可能的。另外,请查看waitfor
和waitforbuttonpress
。它主要用于图形对象,但您可以很容易地看到一个显示“当前正在播放音频”等的图形