Octave 从函数播放音频文件的倍频程

Octave 从函数播放音频文件的倍频程,octave,Octave,我想写一个函数,将音频文件地址作为输入,然后对该音频文件进行一些更改并播放它 我是Octave新手,通过查看文档,我得到了下面的代码 function main % clear screen clear; clc; audio_src_address = 'introduction.wav'; NegateAudioPhase(audio_src_address); endfunction; function NegateAudioPhase (aud

我想写一个函数,将音频文件地址作为输入,然后对该音频文件进行一些更改并播放它

我是Octave新手,通过查看文档,我得到了下面的代码

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
。它主要用于图形对象,但您可以很容易地看到一个显示“当前正在播放音频”等的图形