问题如标题所述。
我抽取一个音频信号,每隔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倍。
我只是希望能够对两个片段进行并排比较。
答案 0 :(得分:2)
虽然@ sage的答案有很多好的信息,但我认为这个问题的答案就像改变你的最后一行一样简单:
wavplay(y,fs/2,'PianoDecimation')
您已删除文件中的一半样本,因此为了在与原始时间相同的时间段内播放,您需要将播放频率设置为每秒样本数量的一半。
答案 1 :(得分:1)
您是否正在使用wavplay,audioplayer或其他内容播放抽取的信号?您是否明确指定了采样频率?
这些函数将采样频率作为参数之一(第二个参数)。在抽取时,您正在降低采样频率,因此需要相应地更新该参数。
此外,在绘制数据时,您应该:
我添加了一个播放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”功能真的会混淆啁啾声(开始时的采样率不是很高的频率),但也许你试图展示这样的东西......