Построение спектрограммы

abraziv
Сообщения: 48
Зарегистрирован: 08 апр 2015, 15:16

Построение спектрограммы

Сообщение abraziv »

Доброго времени суток. Стоит задача реализовать вывод мгновенного спектра Фурье (спектрограмму). Хотел спросить у знающих людей по поводу оптимизации.
Вообщем есть файл длиной L, для простоты L является степенью двойки. Окно размером M, разумеется размер степень двойки. Посчитали окна и загнали в двумерный массив array[L/M][M].
Теперь моё видение алгоритма построения спектрограммы (прямоугольное окно(программы), частоты снизу-вверх, время слева-направо). Интерполируем каждое окно согласно высоте окна программы и сохраняем в новом массиве arrinterpol[L/M][M], после этого каждый i-ый отчёт всех L/M интерполированных окон будет представлять развёртку по времени, которую необходимо интерполировать согласно ширине окна. Всё красиво в теории, на практике получается полная ерунда. Далеко ходить не будем, рассмотрим только первую часть построения спектрограммы, а именно гомоморфизм (отображение) окна длинной M на окно (программы) высотой H.
Пусть W = 32, H = 10. Вычислим шаг интерполяции k = W/H = 3.2, получается необходимо брать отчёты через каждые 3.2 индекса. Если задуматься получается ерунда, т.к. большая часть данных теряется, чтобы исправить эту ситуацию и учитывая, что шаг должен быть равномерным, округлим k до большего целого (ceil) и раздели на шаг k, получим k2 = 3.2 / 4 = 0.8 выходит, чтобы избежать потери информации и сделать отображение равномерным, необходимо накапливать интерполированные отчёты в течении 4 итераций с шагом 0.8 и после делить на полученную сумму на 4. Так мы получим первый отчёт который можно отобразить на окно (программы) высотой 10. Осталось повторить 9 раз. Это необходимо проделать для каждого окна и после незабываем про интерполяцию по времени (по ширине) :shock: .
В итоге получается очень много вычислений, даже если использовать линейную интерполяцию y = (y2 - y1)*x + y1, x=[0,1]. Получается если мне нужно обработать файлик размером 100 МБ и после этого активно работать с спектрограммой и окном (программы), т.е. изменять размер окна, масштабировать и т.д. будут наблюдаться сильные тормоза (ну согласитесь же).
Как можно оптимизировать эту всю канитель ?

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1114
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Построение спектрограммы

Сообщение Бахурин Сергей »

не совсем понял зачем делать интерполяцию данных для подгонки под размеры окна. Правильнее отрисовывать спектрограмму в битмап такого размера который соответсвет данным и масштабировать под rect окна стандартными средствами графических библиотек (GDI, GDI+, cairo ....) Это будет гораздо эффективнее потому что будет выполняться на аппаратном уровне.

abraziv
Сообщения: 48
Зарегистрирован: 08 апр 2015, 15:16

Re: Построение спектрограммы

Сообщение abraziv »

А если памяти впритык ? Если данных 700 МБ ? Интерполяция для захвата отчёта с вещественным номером. Разве аппаратное масштабирование работает с не степенью двойки?

abraziv
Сообщения: 48
Зарегистрирован: 08 апр 2015, 15:16

Re: Построение спектрограммы

Сообщение abraziv »

Сергей спасибо вам за ответ. Попробую, как вы сказали, если не устроит качество, даже не знаю, что тогда.

Ответить