Обратная спектрограмма A La Aphex Twin в MATLAB - PullRequest
8 голосов
/ 05 августа 2009

Я пытаюсь преобразовать изображение в аудиосигнал в 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

Ответы [ 2 ]

6 голосов
/ 05 августа 2009

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

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

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

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

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

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

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

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

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

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

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

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

spectrogramWindow = image(:, i);
spectrogramWindow = [spectrogramWindow;reverse(spectrogramWindow(skip first and last))]
signalWindow = ifft(spectrogramWindow);
signal = [signal; signalWindow];
1 голос
/ 29 июня 2010

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

http://devrand.org/show_item.html?item=64&page=Project

...