Вопрос по math, audio, algorithm – Как визуализировать аудиоданные?

11

Я хотел бы иметь что-то, что выглядит примерно так. Два разных цвета не обязательно.

Audacity на Mac http://audacity.sourceforge.net/about/images/audacity-macosx.png

У меня уже есть аудиоданные (один сэмпл / миллисекунда) из стереофонического wav-файла в двух массивах int, по одному для левого и правого каналов. Я предпринял несколько попыток, но они не выглядят настолько ясными, как мои, мои попытки добраться до спики или компактного комка.

Есть хорошие предложения? Я работаю в c #, но с psuedocode все в порядке.

Предположим, у нас есть

a function DrawLine(color, x1, y1, x2, y2) two int arrays with data right[] and left[] of lenght L data values between 32767 and -32768

Если вы делаете какие-либо другие предположения, просто запишите их в своем ответе.

<code>for(i = 0; i < L - 1; i++) {
  // What magic goes here?
}
</code>

Вот как оказалось когда я подал заявкурешение Хан предоставил, (только один канал)
альтернативный текст http://www.imagechicken.com/uploads/1245877759099921200.jpg

Audacity с открытым исходным кодом, так что вы можете посмотреть на код. Я предполагаю что-то вроде следующего ... func getHeight (v) {return abs (v) * 32767 / viewArea.height / 2); samplesPerPixelColumn = samples.len / viewArea.width; для i = 1 - viewArea.width {avgV = Avg (samples [i-i + samplesPerPixelColumn]); colHeight = getHeight (avgV); если avgV & gt; = 0 DrawLine (черный, i, viewArea.height / 2, i, (viewArea.height / 2) + colHeight) else DrawLine (черный, i, viewArea.height / 2, i, (viewArea.height / 2) - colHeight); Вам, вероятно, потребуется выполнить некоторую обработку округления / диапазона, но это должно быть суть. steamer25
Почему бы вам не положить это в ответ. Nifle
Я хотел дать вам кое-что, что могло бы быть немедленно полезным, но не было бы опущено, если часть этого была выключена. Больше мыслей. Вместо вертикальных линий нарисуйте диагонали между предыдущей точкой графика и следующей ... Кроме того, если вы увеличите масштаб достаточно, у вас будет несколько пикселей на образец. steamer25

Ваш Ответ

2   ответа
2

у вас будет более 1 выборки для каждого пикселя. Для каждой группы семплов, сопоставленных с одним пикселем, вы можете нарисовать (вертикальный) отрезок линии от минимального значения в группе семплов до максимального значения. Если вы увеличиваете до 1 выборки на пиксель или меньше, это больше не работает, и "хороший". Решением было бы отобразить интерполированные значения sinc. Поскольку DrawLine не может рисовать один пиксель, существует небольшая проблема, когда минимальное и максимальное значения совпадают. В этом случае вы можете скопировать однопиксельное изображение в нужную позицию, как показано в коде ниже:

double samplesPerPixel = (double)L / _width;
double firstSample = 0;
int endSample = firstSample + L - 1;
for (short pixel = 0; pixel < _width; pixel++)
{
    int lastSample = __min(endSample, (int)(firstSample + samplesPerPixel));
    double Y = _data[channel][(int)firstSample];
    double minY = Y;
    double maxY = Y;
    for (int sample = (int)firstSample + 1; sample <= lastSample; sample++)
    {
        Y = _data[channel][sample];
        minY = __min(Y, minY);
        maxY = __max(Y, maxY);
    }
    x = pixel + _offsetx;
    y1 = Value2Pixel(minY);
    y2 = Value2Pixel(maxY);
    if (y1 == y2)
    {
        g->DrawImageUnscaled(bm, x, y1);
    }
    else
    {
        g->DrawLine(pen, x, y1, x, y2);
    }
    firstSample += samplesPerPixel;
}

Обратите внимание, что Value2Pixel масштабирует значение выборки до значения в пикселях (в направлении y).

0

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

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

Error: User Rate Limit Exceeded Nifle

Похожие вопросы