Здесь есть несколько небольших заблуждений.
Я рассмотрю проблемы в порядке возникновения, а не серьезности:
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];