dsp. STFT

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

Описание

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

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

Создание

Синтаксис

stf = dsp.STFT
stf = dsp.STFT(window)
stf = dsp.STFT(window,overlap)
stf = dsp.STFT(window,overlap,nfft)
stf = dsp.STFT(Name,Value)

Описание

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

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

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

пример

stf = dsp.STFT(window,overlap,nfft) возвращает кратковременный объект FFT с набором свойств Window к window, набором свойств OverlapLength к overlap и набором свойств FFTLength к nfft.

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

Свойства

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

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

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

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

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

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

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

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

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

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

Синтаксис

y = stf(x)

Описание

пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

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

Вот шаги, вовлеченные в выполнение кратковременного спектрального затухания:

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

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

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

Используйте 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.ISTFT и dsp.STFT. Установите длину окна, равную входной длине кадра и длине транзитного участка к 16. Длина перекрытия является различием между длиной окна и длиной транзитного участка, OL = WLHL. Установите длину БПФ на 1 024.

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 одной длиной транзитного участка за один раз. Примените предполагаемое усиление к преобразованному сигналу. Восстановите denoised версию исходного речевого сигнала путем выполнения обратного преобразования Фурье на отдельных диапазонах частот. Проигрывайте denoised звуковой сигнал к аудио устройству компьютера.

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

m=-g(n-г-н)=1,nΖ     (gКОЛА(R))

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

Функция iscola

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

ISTFT со взвешенным перекрытием - добавляют (ВОЛЯ)

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

Функция iscola

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

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

Восстановите данные с ВОЛЕЙ

Выпустите 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 = 2.4499e-15

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

Больше о

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

Алгоритмы

Вот эскиз того, как алгоритм реализован:

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

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

Ссылки

[1] Аллен, J.B., и Л. Р. Рэбинер. "Объединенный Подход к Кратковременному анализу Фурье и Синтезу'', Продолжения IEEE, Издания 65, стр 1558–1564, ноябрь 1977.

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

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

Смотрите также

Объекты

Блоки

Введенный в R2019a