Вопрос

Я пытаюсь преобразовать изображение в аудиосигнал в MATLAB, рассматривая его как спектрограмму как в Песня Aphex Twin на Windowlicker . К сожалению, у меня проблемы с получением результата.

Вот что у меня есть на данный момент:

function signal = imagetosignal(path, format)

    % Read in the image and make it symmetric.
    image = imread(path, format);
    image = [image; flipud(image)];
    [row, column] = size(image);
    signal = [];

    % Take the ifft of each column of pixels and piece together the real-valued results.
    for i = 1 : column

        spectrogramWindow = image(:, i);
        R = abs(ifft(spectrogramWindow));
        % Take only the results for the positive frequencies.
        signalWindow = R(1 : row / 2.0);
        signal = [signal; signalWindow];

    end

end

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

spectrogram(imagetosignal('image', 'bmp'));

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

<Ч>

Изменить . Спасибо, Дейв! Я получил это работает! Я закончил с этим:

function signal = imagetosignal(path, format)

    % Read in the image and make it symmetric.
    image = imread(path, format);
    image = [image; flipud(image)];
    [row, column] = size(image);
    signal = [];

    % Take the ifft of each column of pixels and piece together the results.
    for i = 1 : column

        spectrogramWindow = image(:, i);
        signalWindow = real(ifft(spectrogramWindow));
        signal = [signal; signalWindow];

    end

end

alt text alt text

Это было полезно?

Решение

Здесь есть несколько небольших заблуждений.

Я рассмотрю проблемы в порядке возникновения, а не по степени серьезности:

1) Ошибка в расчете на спектрографическое окно (изображение)

Первая запись массива должна быть компонентой 0 Гц, следующая - N Гц. Последний элемент массива должен быть компонентом -N Гц. Тем не менее, вы рассчитали 0 Гц.

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

Кроме того, вы можете НЕ добавлять изображение к себе, а после извлечения spectrogramWindow из изображения применить некоторую функцию, чтобы сделать его эрмитовым симметричным.

2) Принимая пресс IFT. Незачем. Не делай этого.

То, что вы получаете от iFFT, если iFFT получает правильный ввод, полностью реально.

Вы видите сложные значения, потому что ввод не является фактически эрмитовым симметричным, как описано выше. Никогда не используйте Abs (). Если вам нужно обмануть, извлеките реальную часть, которая не будет складываться в мусор из воображаемого компонента.

3) Вы выбрасываете вторую половину сигнала.

Как только вы получаете вывод от iFFT, он представляет запрошенный вами сигнал. Не думайте об этом с точки зрения частот, теперь это аудио-временной ряд. Сохраните все это.

Вот как я это вижу:

spectrogramWindow = image(:, i);
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))]
signalWindow = ifft(spectrogramWindow);
signal = [signal; signalWindow];

Другие советы

Просто исследую ту же самую вещь и нашел этот скрипт на Perl. Думаю, вам может понравиться ссылка.

http://devrand.org/show_item.html?item=64&page = Проект

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top