dsp.STFT

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

Описание

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

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

Создание

Описание

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

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

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

пример

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

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

Свойства

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

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

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

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

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

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

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

Длина БПФ, заданная как положительное целое число. Это свойство определяет длину выхода STFT (количество строк). Длина БПФ должна быть больше или равной длине окна.

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

Частотная область значений, в котором вычисляется кратковременное БПФ, заданный как:

  • 'twosided' --Кратковременный БПФ вычисляется для сложных или реальных сигналов входов. Длина кратковременного БПФ равна значению, заданному в FFTLength свойство.

  • 'onesided' - Односторонняя БПФ короткого времени вычисляется только для действительных входных сигналов. Когда длина БПФ четная, коротковременная длина БПФ FFTLength/2+1. Если длина БПФ нечетная, длина короткого БПФ равна (FFTLength+1)/2.

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

Синтаксис

Описание

пример

y = stf(x) применяет кратковременное БПФ на входе x и возвращает вывод частотного диапазона y.

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

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

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

Входной вход может быть сигналом переменного размера. То есть формат кадра сигнала может измениться между вызовами алгоритма объекта, не вызывая release функция. Количество каналов должно остаться неизменным.

Если на FrequencyRange для свойства задано значение 'onesided', вход должен быть вещественным. Если на FrequencyRange для свойства задано значение 'twosided', вход может быть действительным или комплексным.

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

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

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

Кратковременный выход БПФ, возвращенный как вектор или матрица.

Если существует достаточное количество выборок (равное длине скачка), чтобы сформировать выход STFT, y является FFTLength-by - N матрица, где N - количество входных каналов. Если недостаточно выборки для формирования вывода STFT, y пуст.

Тип данных выхода соответствует типу входного сигнала.

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

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

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

Примеры

свернуть все

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

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

  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 Различие между входным сигналом и восстановленным сигналом очень мала, что указывает на то, что сигнал был восстановлен идеально.

Подробнее о

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

Алгоритмы

Вот эскиз реализации алгоритма:

Входной сигнал временной области буферизуется на основе заданной пользователем длины окна (WL) и длины перекрытия (OL). Размер хмеля, R, определяется как R = WL - OL. Буферизованные окна умножаются на заданное пользователем окно длины WL. Выходные выходы STFT являются БПФ этого продукта. Количество выборок во временной области, необходимых для формирования нового выхода БПФ, R.

Вот рисунок того, как выглядит случайный сигнал в исходной временной области, после умножения с перекрывающимися окнами и после применения БПФ к умноженным окнам:

Ссылки

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

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

Генерация кода C/C + +
Сгенерируйте код C и C++ с помощью Coder™ MATLAB ®

.

См. также

Объекты

Блоки

Введенный в R2019a