Как воспроизвести сэмплированный аудиофайл с той же скоростью, что и оригинал? - PullRequest
1 голос
/ 29 декабря 2010

Вопрос как указано в названии.

После того, как я обработал аудиосигнал, который выдает каждую 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 ]

2 голосов
/ 05 января 2011

Хотя ответ @ sage содержит много полезной информации, я думаю, что ответ на вопрос так же прост, как и изменение последней строки на:

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

Вы удалили половину сэмплов в файле, поэтому, чтобы воспроизвести его в течение того же периода времени, что и оригинал, необходимо установить частоту воспроизведения, равную половине числа сэмплов в секунду.

1 голос
/ 29 декабря 2010

Используете ли вы wavplay, аудиоплеер или что-то еще для воспроизведения прореженных сигналов? Вы явно указываете частоты дискретизации?

Функции принимают частоту дискретизации в качестве одного из параметров (второй параметр). Вы уменьшаете частоту дискретизации по мере того, как вы ее используете, поэтому вам нужно соответствующим образом обновить этот параметр.

Кроме того, при построении графика вы должны:

  1. построите в N раз больше точек на исходных данных (при расчете на N)
  2. предоставьте соответствующий ввод по оси x - я рекомендую t = (1 / Fs: 1 / Fs: maxT), где maxT - это максимальное время, которое вы хотите построить, что будет соответствовать # 1, если вы используете обновленные F, что будет привести к большим временным шагам (и убедитесь, что транспонировал t, если он не соответствует вашему сигналу)

Я добавил пример, который воспроизводит чирп и децимированный чирп (этот чирп является частью стандартной установки 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' действительно портит звук чириканья (частота дискретизации которого не очень высокая частота для начала), но, возможно, вы пытаетесь показать что-то вроде этого ...

...