Страница 1 из 1

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

Добавлено: 30 ноя 2016, 13:20
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 МБ и после этого активно работать с спектрограммой и окном (программы), т.е. изменять размер окна, масштабировать и т.д. будут наблюдаться сильные тормоза (ну согласитесь же).
Как можно оптимизировать эту всю канитель ?

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

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

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

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

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

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