2012-03-06 4 views
4

Учитывая следующие параметры:Как рассчитать количество выборок в аудио с учетом некоторых параметров?

Sample size: 16 
Channel count: 2 
Codec: audio/pcm 
Byte order: little endian 
Sample rate: 11025 
Sample type: signed int 

Как я могу определить количество образцов для N miliseconds записанного звука? Я новичок в обработке аудио. Кодек PCM, поэтому я думаю, что это несжатый звук.

Я использую Qt 4.8 для Windows 7 Ultimate x64.

ответ

9

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

Частота выборки - это количество выборок в секунду аудио, в вашем случае 11025 (иногда это выражается в кГц) это довольно мало по сравнению с чем-то вроде аудио CD, который составляет 44,1 кГц, так что частота дискретизации 44100 и есть более высокие стандарты, такие как 48 кГц, 96 кГц.

Далее у вас есть количество бит, используемых для каждого образца, обычно это 8/16/24/32 бит.

Далее вы можете получить произвольное количество каналов для каждого образца.

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

Это может оказаться довольно сложным, если вы начнете применять это к видео, которое имеет дело с кадрами, которые являются либо хорошими цифрами, как 25/30/50/60 кадров в секунду для NTSC, которые являются 23.98/29.97/59.94 кадрами вторых, в этом случае вам нужно сделать ужасные вычисления, чтобы убедиться, что они правильно выровнены.

Надеюсь, что это поможет.

+0

хорошо, но нет формулы в конце ... – UmNyobe

+0

пользователь perreal предоставил адекватный образец кода, поэтому я подумал, что лучше не дублировать. – EdChum

9
/** 
    * Converts milliseconds to samples of buffer. 
    * @param ms the time in milliseconds 
    * @return the size of the buffer in samples 
    */ 
    int msToSamples(int ms, int sampleRate, int channels) { 
     return (int)(((long) ms) * sampleRate * channels/1000); 
    } 

    /* get size of a buffer to hold nSamples */ 
    int samplesToBytes(int nSamples, int sampleSizeBits) { 
     return nSamples * (sampleSizeBits/8); 
    } 

Reference

+0

Я думаю, что формула должна быть '(int) (((long) ms) * sampleRate * channels/1000)/(sampleSize/8)', если я правильно ее понимаю. я прав? – Donotalo

+0

Размер выборки не имеет значения при вычислении количества выборок, поскольку скорость не определена в байтах, а в количестве выборок. – perreal

+0

Похоже, что у образцовToBytes отсутствует количество каналов при его умножении. – rationalcoder

0

Здесь раствор в псевдокоде:

Учитывая длительность

= 20 ... в миллисекундах & ср = 11025 ... SAMPLINGRATE в Гц

то число выборок N

N = ср * Dur/1000 = 220,5

Вам нужно округлить это до ближайшего целого числа.

 Смежные вопросы

  • Нет связанных вопросов^_^