matlab - 向录制的音频添加回声

标签 matlab audio signal-processing audio-recording

我已经在Matlab中录制了自己的声音,并打算在其中添加一些回声,我想出了一种解决方案来获得所需的回声效果:

  • 在时域中延迟采样的音频,并将其添加到原始采样中。

  • 为了做到这一点,我正在使用Matlab,基本上已经完成了以下工作:
    recObj = audiorecorder(44100, 16, 2);%sampling rate of 44100Hz, stereo
    recordblocking(recObj,length);%record audio for a fixed length duration
    y = time_delay(getaudiodata(recObj) , 5000 );%set a delay of 5000 to original sampled audio data
    
    function [ y ]  = time_delay ( x , R )
    %this function sets a delay to x of R
    y = zeros(length(x) + R , 1);
    y(R + 1:length(y)) = x(1:length(x));
    

    如您所见,我可以使用recObj来播放录制的音频。为了获得录制音频的延迟版本,我使用了getaudiodata(recObj)和我自己的函数time_delay。我遇到的一个问题是我我不知道如何从time_delay函数获取的延迟音频数据中获取新的延迟音频记录器对象,我需要一个音频记录对象,因为这是播放某些东西的唯一方法。
    所以,我的问题是:
  • 这是在音频中获得所需回声效果的好方法吗?
    信号?
  • 如果是,那么如何将延迟的音频数据设置为
    录音机对象?
  • 最佳答案

    这是用于添加两个信号(延迟和非延迟)的代码:

        x = getaudiodata(recObj); n1 = 1:size(x,1);%audiodata of original signal
        y = time_delay(x , 50000 ); n2 = 1:size(y,1);%audiodata of delayed signal
        mixed = sigadd(x,y,n1,n2); %audiodata of mixed signal
        mixrecObj = audioplayer(mixed,44100);
        play(mixrecObj);
    

    这是sigadd函数:
    function [ y,n ] = sigadd( x1,x2,n1,n2 )
    %implements y[n] = x1[n] + x2[n]
    %y = sum sequence over n wich includes n1 and n2
    %x1 = first sequence over n1
    %x2 = second sequence over n2
    %
    
    n = min(min(n1),min(n2)):max(max(n1),max(n2)); %duration of y(n)
    y1 = zeros(1,length(n)); y2 = y1;
    y1(find((n >= min(n1))&(n <= max(n1)) == 1)) = x1;
    y2(find((n >= min(n2))&(n <= max(n2)) == 1)) = x2;
    y = y1 + y2;
    end
    

    这可以完美地工作,但不足以获得真正的回声效果。为了存档,我们必须
    创建更多延迟的信号(当然会有不同的延迟),然后将它们全部添加,如下所示:
    x = getaudiodata(recObj); n1 = 1:size(x,1);
    y = tim_delay(x , 5000 ); n2 = 1:size(y,1);
    s = time_delay(x , 4000 ); n3 = 1:size(s,1);
    d = time_delay(x , 3000 ); n4 = 1:size(d,1);
    mixed1 = sigadd(s,d,n3,n4);n5 = 1:size(mixed1,2);
    mixed2 = sigadd(x,y,n1,n2);n6 = 1:size(mixed2,2);
    totmixed = sigadd(mixed1,mixed2,n5,n6);
    mixrecObj = audioplayer(totmixed,44100);
    play(mixrecObj);
    

    我用三个延迟和原始延迟测试了这个,您可以听到一个很好的回声。

    注意:在第三段代码中,最好有一个函数通过将回声效果索引作为参数传递给它,以回声的形式返回信号,但为简单起见,我还是以这种方式保留了它。

    关于matlab - 向录制的音频添加回声,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15170370/

    相关文章:

    matlab - 使用可变精度算法获取数字的第一个有效数字

    matlab - 寻找K近邻及其实现

    matlab - 确定信号频率

    html - 无法解码 Firefox 媒体资源文件.wav

    python - 使用 FFT 计算滤波器 (b,a,x,zi)

    使用 FFT 的 Matlab 模板匹配

    javascript - 如何播放/暂停声音以及声音从头开始播放?

    audio - ffmpeg 音频转换 : encoder pcm_u8 working pcm_s8 not

    algorithm - 如何在php中检测歌曲的BPM

    python - 为什么 mlab 和 scipy.signal 的交叉光谱不同?