dsp.ISTFT

Обратный кратковременный БПФ

Описание

The dsp.ISTFT объект вычисляет обратное кратковременное преобразование Фурье (ISTFT) входного сигнала частотного диапазона и возвращает выход временной области. Объект принимает системы координат данных, преобразованных Фурье, преобразует эти системы координат в временной интервал с помощью операции ОБПФа и выполняет добавление перекрытия, чтобы восстановить данные. Выходом объекта является восстановленный сигнал, нормированный множителем, который зависит от длины и суммы скачка (window). Для получения дополнительной информации см. «Алгоритмы».

Создание

Описание

istf = dsp.ISTFT возвращает объект, istf, который реализует обратное кратковременное БПФ. Объект обрабатывает данные независимо по каждому входному каналу с течением времени.

istf = dsp.ISTFT(window) возвращает объект обратного кратковременного БПФ с набором свойств Window в window.

istf = dsp.ISTFT(window,overlap) возвращает объект обратного кратковременного БПФ с набором свойств Window в window и набор свойств OverlapLength, чтобы overlap.

istf = dsp.ISTFT(window,overlap,isconjsym) возвращает обратный кратковременный объект БПФ со Window значение свойства установлено в window, OverlapLength значение свойства установлено в overlap, и набор свойств ConjugateSymmetricInput для isconjsym.

istf = dsp.ISTFT(window,overlap,isconjsym,woa) возвращает обратный кратковременный объект БПФ со Window значение свойства установлено в window, с OverlapLength значение свойства установлено в overlap, а ConjugateSymmetricInput значение свойства установлено в isconjsym, и набор свойств WeightedOverlapAdd к woa.

istf = dsp.ISTFT(Name,Value) возвращает обратный кратковременный объект БПФ с каждым заданным именем свойства, установленным на заданное значение. Можно задать дополнительные аргументы пары "имя-значение" в любом порядке.

Свойства

расширить все

Окно синтеза, заданное как вектор действительных элементов.

Настраиваемый: Да

Типы данных: single | double

Количество выборок, по которым перекрываются последовательные окна, заданное в виде положительного целого числа. Окна перекрываются, чтобы уменьшить программные продукты на контурах данных.

Длина скачка - это различие между длиной окна и длиной перекрытия.

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

Установите это свойство на true если вход сопряжен с симметрией, что приводит к реальным выходам. БПФ реального сигнала сопряжен с симметрией и устанавливает это свойство на true оптимизирует метод расчета ОБПФ. Установка значения свойства false для сопряженных симметричных входов приводит к комплексным выходным значениям с маленькими мнимыми частями. Установка значения свойства true для несопряженных симметричных входов приводит к недопустимым выходам.

Типы данных: logical

Установите это свойство на true для применения взвешенного наложения-добавления. В взвешенном перекрытии-добавлении выход ОБПФ умножается на окно перед перекрытием-добавлением. Установите это свойство на false чтобы пропустить умножение на окно.

Типы данных: logical

Задайте частотную область значений следующим 'onesided' или 'twosided'. Если вы задаете FrequencyRange свойство для:

  • 'twosided' - Обратный кратковременный БПФ вычисляется для двустороннего коротковременного БПФ. Используемая длина БПФ равна длине входного кадра.

  • 'onesided' - Одностороннее обратное БПФ с коротким временем вычисляется для одностороннего БПФ с коротким временем. Если длина входного кадра нечетная, используется длина БПФ (система координат кадра − 1) × 2. Если длина входного кадра четная, используется длина БПФ (система координат × 2) − 1.

Использование

Синтаксис

Описание

пример

y = istft(x) применяет обратное кратковременное БПФ на входе x, и возвращает выход во временной области y.

Входные параметры

расширить все

Входной сигнал частотного диапазона, заданный как вектор или матрица. Если вход является матрицей, объект рассматривает каждый столбец как независимый канал. Длина БПФ равна количеству строк x. Длина БПФ, следовательно, количество входа строк должно быть больше или равно длине окна.

Типы данных: single | double
Поддержка комплексного числа: Да

Выходные аргументы

расширить все

Обратный кратковременный выход БПФ, возвращенный как вектор или матрица. Длина выходной системы координат (количество строк в y) равно WLOL, где WL - длина окна, а OL - длина перекрытия.

Выход комплексен с маленькими мнимыми частями, когда вход x сопряженный симметричный и ConjugateSymmetricInput для свойства задано значение false. Тип данных выхода соответствует типу данных входного сигнала.

Типы данных: single | double
Поддержка комплексного числа: Да

Функции объекта

stepЗапуск алгоритма системного объекта
releaseОтпустите ресурсы и допустите изменения в значениях свойств системного объекта и входных характеристиках
resetСброс внутренних состояний Системного объекта
cloneСоздайте повторяющийся системный объект
isLockedОпределите, используется ли системный объект

Примеры

свернуть все

Короткое спектральное ослабление достигается путем применения изменяющегося во времени ослабления к коротковременному спектру сигнала с шумом. Усиление ослабления определяется оценкой степени шума в каждом поддиапазоне спектра. Это усиление, приложенное к шумному спектру, ослабляет поддиапазоны с более высокой степенью и поднимает поддиапазоны с меньшей шумовой степенью.

Вот шаги, участвующие в выполнении короткого спектрального ослабления:

  1. Анализ зашумленного входного сигнала путем вычисления кратковременного преобразования Фурье (STFT).

  2. Умножьте каждый поддиапазон преобразованного сигнала с действительным положительным усилением менее 1.

  3. Синтезируйте деноизированные поддиапазоны, взяв обратное короткое преобразование Фурье (ISTFT). Реконструированный сигнал является деноизированным входным сигналом.

Используйте dsp.STFT и dsp.ISTFT объекты для вычисления кратковременного и обратного коротковременного преобразований Фурье, соответственно.

Шумный входной сигнал

Вход является аудиосигналом, дискретизированным на частоте 22 050 Гц. The dsp.AudioFileReader объект считывает этот сигнал в системах координат из 512 выборок. Аудиосигнал повреждается белым Гауссовым шумом, который имеет стандартное отклонение 0,05. Используйте audioDeviceWriter объект, чтобы воспроизвести шумный аудиосигнал на аудио устройство вашего компьютера.

FrameLength = 512;
afr = dsp.AudioFileReader('speech_dft.wav',...
    'SamplesPerFrame',FrameLength);
adw = audioDeviceWriter('SampleRate',afr.SampleRate);

noiseStd = 0.05;
while ~isDone(afr)
    cleanAudio = afr();
    noisyAudio = cleanAudio + noiseStd * randn(FrameLength,1);
    adw(noisyAudio);
end
reset(afr)

Инициализируйте объекты преобразования Фурье короткого времени и обратного короткого времени

Инициализируйте dsp.STFT и dsp.ISTFT объекты. Установите длину окна равную длине входного кадра, а длину скачка равной 16. Длина перекрытия - это различие между длиной окна и длиной скачка, OL = WL - HL. Установите длину БПФ равной 1024.

WindowLength = FrameLength;
HopLength = 16;
numHopsPerFrame = FrameLength / 16;
FFTLength = 1024;

Окно, используемое для вычисления STFT и ISTFT, является периодическим hamming окно с длиной 512. The ConjugateSymmetricInput флаг istf для объекта задано значение true, что указывает на выход istf объект является сопряженным-симметричным сигналом.

win = hamming(WindowLength,'periodic');
stf = dsp.STFT(win,WindowLength-HopLength,FFTLength);
istf = dsp.ISTFT(win,WindowLength-HopLength,1,0);

Оценка усиления

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

dec = 16;
alpha = 15;
stftNorm = (sum(win.*win) / dec).^2;

Спектральное ослабление

Подайте аудиосигнал на stf по одному интерполяцию за раз. Примените расчетный коэффициент усиления к преобразованному сигналу. Восстановите деноизированную версию исходного речевого сигнала путем выполнения обратного преобразования Фурье на отдельных полосах. Воспроизведите деноизированный аудиосигнал в аудио устройство компьютера.

while ~isDone(afr)
    cleanAudio =  afr();
    noisyAudio = cleanAudio + noiseStd * randn(FrameLength,1);
    y = zeros(FrameLength,1); % y holds the denoised audio frame
    
    % Feed audio to stft one hop-length at a time
    for index = 1:numHopsPerFrame        
        X = stf(noisyAudio((index-1)*HopLength+1:index*HopLength));        
        % Gain estimator
        Z = abs(X).^2 / (noiseStd^2 * alpha) / stftNorm;
        Z(Z<=1) = 1;
        Z = 1 - 1./Z;
        Z = sign(Z) .* sqrt(abs(Z));
        X = X .* Z;        
        % Convert back to time-domain
        y((index-1)*HopLength+1:index*HopLength) = istf(X);        
    end    
    % Listen to denoised audio:
    adw(y);
end

Идеальная реконструкция - это когда выход dsp.ISTFT соответствует входу в dsp.STFT. Идеальная реконструкция получается, если окно анализа, g(n), подчиняется свойству constant ollap-add (COLA) при размере скачка R.

m=-g(n-mR)=1,nΖ     (gCOLA(R))

Сигнал идеально восстанавливается, если выход dsp.ISTFT объект соответствует входу в dsp.STFT объект.

iscola Функция

The iscola функция проверяет, что заданное окно и перекрытие удовлетворяют ограничению COLA, чтобы убедиться, что обратное короткое преобразование Фурье (ISTFT) приводит к идеальной реконструкции для немодифицированных спектров. Функция возвращает логическое true если комбинация параметров входа совместима с COLA и является логической false если нет. The method аргумент функции установлен в 'ola' или 'wola' в зависимости от того, использует ли метод инверсии взвешенное перекрытие-добавление (WOLA).

Проверьте, hann() Окно длины 120 выборок и длины перекрытия 60 выборок соответствует COLA.

winLen = 120;
overlapLen = 60;
win = hann(winLen,'periodic');
tf = iscola(win,overlapLen,'ola')
tf = logical
   1

Инициализация

Инициализируйте dsp.STFT и dsp.ISTFT Системные объекты с этим hann окно, совместимое с COLA. Установите длину БПФ равной длине окна.

frameLen = winLen-overlapLen;
stf = dsp.STFT('Window',win,'OverlapLength',overlapLen,'FFTLength',winLen);
istf = dsp.ISTFT('Window',win,'OverlapLength',overlapLen,'WeightedOverlapAdd',0);

Восстановление данных

Вычислите STFT случайного сигнала. Установите длину входного сигнала равной длине скачка (длина окна - длина перекрытия). Поскольку окно соответствует COLA, ISTFT этих немодифицированных спектров идеально восстанавливает исходный сигнал временной области.

Чтобы подтвердить, сравните вход, x с восстановленным выходом, y. Из-за задержки, введенной объектами, восстановленный выход сдвигается во времени по сравнению с входом. Поэтому, чтобы сравнить, примите норму различия между восстановленным выходом, y и предыдущим входом, xprev. Норма очень маленькая, что указывает на то, что выходной сигнал является идеально восстановленной версией входного сигнала.

n = zeros(1,100);
xprev = 0;
for i = 1:100
    x = randn(frameLen,1);
    X = stf(x);
    y = istf(X);
    n(1,i) = norm(y-xprev);
    xprev = x;
end       
max(abs(n))
ans = 1.6972e-13

ISTFT с взвешенным наложением-Add (WOLA)

В WOLA, втором окне, называемом окном синтеза, f(n), применяется после операции IFFT и перед наложением-добавлением. Окна синтеза и анализа обычно идентичны и обычно получаются путем взятия квадратного корня окон, удовлетворяющих COLA (тем самым обеспечивая совершенную реконструкцию).

iscola Функция

Проверьте, sqrt(hann()) Окно длины 120 выборок и длины перекрытия 60 выборок соответствует WOLA. Установите method аргумент iscola функции в 'wola'. Выходные выходы iscola функция равна 1, что указывает, что это окно соответствует WOLA.

winWOLA = sqrt(hann(winLen,'periodic'));
tfWOLA = iscola(winWOLA,overlapLen,'wola')
tfWOLA = logical
   1

Восстановление данных с помощью WOLA

Отпустите dsp.STFT и dsp.ISTFT Системные объекты и установите окно равным sqrt(hann(winLen,'periodic')) окно. Чтобы использовать взвешенное перекрытие-добавить на ISTFT side, установите 'WeightedOverlapAdd' на true.

release(stf);
release(istf);
stf.Window = winWOLA;
istf.Window = winWOLA;
istf.WeightedOverlapAdd = true;

n = zeros(1,100);
xprev = 0;
for i = 1:100
    x = randn(frameLen,1);
    X = stf(x);
    y = istf(X);
    n(1,i) = norm(y-xprev);
    xprev = x;
end       
max(abs(n))
ans = 4.6664e-15

The norm Различие между входным сигналом и восстановленным сигналом очень мала, что указывает на то, что сигнал был восстановлен идеально.

Подробнее о

расширить все

Алгоритмы

Вот эскиз того, как алгоритм реализован без взвешенного перекрытия-добавления (WOLA):

Вход частотного диапазона инвертируется с помощью ОБПФ, и затем выполняется наложение-добавление. Обратите внимание, что каждый запуск алгоритма генерирует R новые выходные выборки во временной области, где R является длиной скачка. Длина скачка определяется как WLOL, где WL - длина окна, а OL - длина перекрытия. Этап нормализации умножает выход на R/sum(win), где win - вектор окна, заданный в Window свойство.

Вот эскиз того, как алгоритм реализован с Weighted Overlap-Add (WOLA):

В WOLA второе окно (обычно называемое окном синтеза) применяется после операции IFFT и до наложения-добавления. WOLA используется для подавления разрывов на контурах системы координат, вызванных нелинейной обработкой STFT. Для получения дополнительной информации смотрите Дополнительные сведения.

Вот рисунок того, как выглядят входные частотные поддиапазоны при инвертировании ОБПФ и наложении-сложении вместе, чтобы восстановить сигнал временной области.

Окно анализа (на стороне STFT) и окно синтеза (на стороне ISTFT) обычно идентичны. Чтобы гарантировать идеальную реконструкцию, окна обычно получаются путем взятия квадратного корня окон, удовлетворяющего свойству постоянного перекрытия-добавления (COLA). Для получения дополнительной информации о свойстве COLA и том, как определена идеальная реконструкция, смотрите More About in dsp.STFT страница.

Ссылки

[1] Аллен, Дж. Б. и Л. Р. Рабинер. «Единый подход к кратковременному фурье-анализу и синтезу», Труды IEEE, том 65, стр. 1558-1564, ноябрь 1977 года.

Расширенные возможности

.

См. также

Объекты

Блоки

Введенный в R2019a