За вечер написал простейшую консольную программу для перевода ч/б изображения в звук (44.1 кГц, Моно, 16 бит), на спектрограмме которого будет отображаться что-то похожее на исходное изображение (для примера - в Adobe Audition 1.5).
Для начала я определился с масштабами. По горизонтали выбрал 1024 звуковых отсчёта на пиксель изображения. Это более-менее оптимально подходит к параметрам FFT в Audition. Размер картинки не ограничен, пропорционален времени звучания. По вертикали решил попробовать 50 Гц на пиксель, начиная с 400 Гц (ибо частоты ниже в Audition отображаются хуже). Решил ограничить размер картинки по вертикали до 256. Итого, верхняя граница в звуке 13.2 кГц. Для начала этого хватит.
Загоняем исходное цветное изображение (bmp, 24 бит, т.е. RGB и по байту на каждый канал). Три цветовых значения каждого пикселя по известной формуле преобразуем в одно чёрнобелое. Внутренний цикл - пробег по вертикали (от 1 до 256). В результате формируются отрезки синусоид соотвествующей частоты и амплитуды (она пропорциональна яркости текущего пикселя картинки) и длинной в 1024 отсчёта (23.2 мс). Затем они суммируются. Предварительно к ним применяю (умножением) "окно сглаживания" - функция, которая "смягчает" отрезок синусоиды по амплитуде. Это нужно для исключения резких переходов и обрывов, из-за которых на спектре будет много лишних шумов. Ведь не на всех используемых частотах в 1024 отсчёта укладывается целое число периодов?! Нужно, чтобы каждый отрезок плавно возрастал и затухал во времени. Пробовал в качестве такой функции брать полусинус, длинной 1024 (частота 21.5 Гц), но там нет точек перегиба, она везде выпуклая. Больше всего подошла функция сигмоида, имеющая известную форму нормального закона распределения. Параметры данной функции (дисперсию и коэфициенты масштабирования) подобрал как можно лучше. Ну а затем переходим на следующий столбец картинки (внешний цикл). И так далее. Звуковые данные для удобства и простоты программы печатаются в текстовый документ специального формата, который открывает не только Блокнот, но и Audition.
Конечно же, всё равно по краям каждого из таких звуковых сегментов не присутствует ожидаемый ноль. Там наоборот сильный всплеск. Это где-то что-то не учтено или баг. Из-за этого звук "трещит", а на изображении спектрограммы присутствуют вертикальные полосы. Выебона на частоте 5500 Гц свяна с большой дискретностью по вертекали: 50 Гц - многовато. В дальнейшем - внутренним циклом сделаю пробег по горизонтали с применением интерполяции амплитуды в масштабе 1:1024, в результате чего будет формироваться полностью непрерывный длинный сигнал. И так на каждой из 256 частот. Затем они просуммируются и результат будет готов.
|