1

问题如标题所述。

在我抽取一个每第 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

4

2 回答 2

2

尽管@sage 的答案有很多很好的信息,但我认为问题的答案很简单,只需将最后一行更改为:

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

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

于 2011-01-05T17:15:15.113 回答
1

您是否使用 wavplay、audioplayer 或其他工具来播放抽取的信号?您是否明确指定了采样频率?

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

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

  1. 在原始数据上绘制 N 倍的点(当抽取 N 时)
  2. 提供相应的 x 轴输入 - 我建议 t = (1/Fs:1/Fs:maxT) 其中 maxT 是您要绘制的最长时间,如果您使用更新后的 Fs,它将解决 #1,这将导致更大时间步长(如果与您的信号不匹配,请确保转置 t)

我添加了一个播放啁啾和抽取啁啾的示例(此啁啾是标准 MATLAB 安装的一部分)。我放大了抽取的版本。tic 和 toc 表明经过的时间是相等的(在处理器负载的变化范围内等) - 请注意,这也适用于 decim = 3 等:

负载啁啾

inWav = y;
inFs = Fs;

小数 = 2;

outWav = decimate(inWav,decim);
outFs = inFs/十进制;

tic, wavplay(inWav,inFs),toc
暂停(0.2)
tic,wavplay(outWav*decim^2,outFs),toc

'decimate' 函数确实弄乱了啁啾声(其采样率一开始就不是很高的频率),但也许你正试图展示这样的东西......

于 2010-12-28T22:36:19.470 回答