exponenta event banner

dsp. STFT

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

Описание

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

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

Создание

Описание

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

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

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

пример

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

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

Свойства

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

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

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

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

Типы данных: 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- по-N матрице, где N - количество входных каналов. Если для формирования вывода STFT недостаточно выборок, y пуст.

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

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

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

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

Примеры

свернуть все

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

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

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

Подробнее

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

Алгоритмы

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

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

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

Ссылки

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

Объекты

Блоки

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