如何以与原始速度相同的速度播放采样音频文件?

时间:2010-12-28 21:44:31

标签: matlab audio signal-processing sampling

问题如标题所述。

我抽取一个音频信号,每隔n点取出一次,然后轮流加速音频片段的n倍。我希望抽取的原始剪辑在时间上具有相同的长度。

继承我的代码,分析和抽取钢琴.wav

[piano,fs]=wavread('piano.wav'); % loads piano
play=piano(:,1); % Renames the file as "play"

t = linspace(0,time,length(play));          % Time vector
x = play;
y = decimate(x,2);

stem(x(1:30)), axis([0 30 -2 2])   % Original signal
title('Original Signal')
figure
stem(y(1:30))                        % Decimated signal
title('Decimated Signal')

%changes the sampling rate

fs1 = fs/2;
fs2 = fs/3;
fs3 = fs/4;
fs4 = fs*2;
fs5 = fs*3;
fs6 = fs*4;

wavwrite(y,fs,'PianoDecimation');

可能的解决方案:将每个剩余点加倍,因为新的抽取剪辑比原始剪辑短2倍。

我只是希望能够对两个片段进行并排比较。

这是音频文件:http://www.4shared.com/audio/11xvNmkd/piano.html

2 个答案:

答案 0 :(得分:2)

虽然@ sage的答案有很多好的信息,但我认为这个问题的答案就像改变你的最后一行一样简单:

 wavplay(y,fs/2,'PianoDecimation')

您已删除文件中的一半样本,因此为了在与原始时间相同的时间段内播放,您需要将播放频率设置为每秒样本数量的一半。

答案 1 :(得分:1)

您是否正在使用wavplay,audioplayer或其他内容播放抽取的信号?您是否明确指定了采样频率?

这些函数将采样频率作为参数之一(第二个参数)。在抽取时,您正在降低采样频率,因此需要相应地更新该参数。

此外,在绘制数据时,您应该:

  1. 在原始数据上绘制N倍(当用N抽取时)
  2. 提供相应的x轴输入 - 我建议t =(1 / Fs:1 / Fs:maxT)其中maxT是你想要绘制的最大时间,如果你使用更新的Fs将会解决#1导致更大的时间步长(如果它与您的信号不匹配,请确保转置t)
  3. 我添加了一个播放chirp和decimated chirp的示例(这个chirp是标准MATLAB安装的一部分)。我放大了抽取版本。 tic和toc显示经过的时间是等效的(在处理器负载的变化范围内等) - 请注意,这也适用于decim = 3等:

    load chirp
    
    inWav = y;
    inFs = Fs;
    
    decim = 2;
    
    outWav = decimate(inWav,decim);
    outFs = inFs/decim;
    
    tic, wavplay(inWav,inFs),toc
    pause(0.2)
    tic,wavplay(outWav*decim^2,outFs),toc
    

    “decimate”功能真的会混淆啁啾声(开始时的采样率不是很高的频率),但也许你试图展示这样的东西......