exponenta event banner

dsp. ISTFT

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

Описание

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

Создание

Описание

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

istf = dsp.ISTFT(window) возвращает обратный кратковременный объект FFT со свойством Window, равным window.

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

istf = dsp.ISTFT(window,overlap,isconjsym) возвращает обратный кратковременный объект FFT с помощью Window свойство имеет значение window, OverlapLength свойство имеет значение overlapи свойству ConjugateSymmetricInput присвоено значение isconjsym.

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

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

Свойства

развернуть все

Окно синтеза, указанное как вектор вещественных элементов.

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

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

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

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

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

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

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

Установить для этого свойства значение true для применения взвешенного перекрытия - добавление. В случае взвешенного наложения-сложения выходные данные IFFT умножаются на окно перед наложением-сложением. Установить для этого свойства значение 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Запустить алгоритм объекта System
releaseДеблокирование ресурсов и разрешение изменений значений свойств объекта системы и входных признаков
resetСброс внутренних состояний объекта System
cloneСоздать повторяющийся объект System
isLockedОпределить, используется ли объект System

Примеры

свернуть все

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

Ниже приведены этапы выполнения кратковременного спектрального ослабления:

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

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

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

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

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

Вход представляет собой звуковой сигнал, дискретизированный на частоте 22 050 Гц. 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. 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 overlap-add (COLA) при размере R.

∑m=-∞∞g (n-mR) = 1, ∀n∈ (g∈COLA (R))

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

iscola Функция

iscola функция проверяет, чтобы указанное окно и перекрытие удовлетворяли ограничению COLA, чтобы гарантировать, что обратное кратковременное преобразование Фурье (ISTFT) приводит к идеальной реконструкции для немодифицированных спектров. Функция возвращает логическое значение true если комбинация входных параметров совместима с COLA и является логической false если нет. 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 с взвешенным перекрытием - добавление (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 сторона, установите '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

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

Подробнее

развернуть все

Алгоритмы

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

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

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

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

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

Окно анализа (на стороне STFT) и окно синтеза (на стороне ISTFT) обычно идентичны. Для обеспечения совершенной реконструкции окна обычно получают путем взятия квадратного корня окон, удовлетворяющих свойству constant overlap-add (COLA). Для получения подробной информации о свойстве COLA и о том, как определяется идеальная реконструкция, см. Подробнее о в dsp.STFT страница.

Ссылки

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

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

.
Представлен в R2019a