dsp.STFT

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

Описание

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

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

Создание

Описание

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

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

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

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

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

Синтаксис

Описание

пример

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

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

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

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

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

  3. Синтезируйте denoised поддиапазоны путем взятия обратного кратковременного преобразования Фурье (ISTFT). Сигнал resconstructed является 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.STFT и dsp.ISTFT объекты. Установите длину окна, равную длине входного кадра и длине транзитного участка к 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-mR)=1,nΖ     (gCOLA(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 = 1.6972e-13

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 = 4.6664e-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