exponenta event banner

stftmag2sig

Реконструкция сигнала по величине STFT

Описание

пример

x = stftmag2sig(s,nfft) возвращает восстановленный реальный сигнал временной области, x, оцененное по величине кратковременного преобразования Фурье (STFT), s, на основе алгоритма Гриффина-Лима. Функция предполагает s был вычислен с использованием длины дискретного преобразования Фурье (DFT) nfft.

пример

x = stftmag2sig(s,nfft,fs) возвращает восстановленный сигнал при условии, что s был отобран со скоростью fs.

x = stftmag2sig(s,nfft,ts) возвращает восстановленный сигнал при условии, что s был взят образец с временем выборки ts.

x = stftmag2sig(___,Name,Value) задает дополнительные параметры с использованием аргументов пары «имя-значение». Опции включают, среди прочего, окно БПФ и метод определения начальных фаз. Эти аргументы можно добавить к любому из предыдущих входных синтаксисов. Например, 'FrequencyRange','onesided','InitializePhaseMethod','random' указывает, что сигнал восстанавливается из одностороннего STFT со случайными начальными фазами.

[x,t,info] = stftmag2sig(___) также возвращает моменты времени, в которые восстанавливается сигнал, и структуру, которая содержит информацию о процессе восстановления.

Примеры

свернуть все

Рассмотрим 512 образцов синусоиды с нормализованной частотой δ/60 рад/образец и значением постоянного тока 1. Вычислите STFT сигнала.

n = 512;

x = cos(pi/60*(0:n-1)')+1;

S = stft(x);

Реконструируйте синусоиду по величине STFT. Постройте график исходных и восстановленных сигналов.

xr = stftmag2sig(abs(S),size(S,1));

plot(x)
hold on
plot(xr,'--','LineWidth',2)
hold off
legend('Original','Reconstructed')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Reconstructed.

Повторите вычисления, но теперь поместите сигнал с нулями для уменьшения краевых эффектов.

xz = circshift([x; zeros(n,1)],n/2);

Sz = stft(xz);
xr = stftmag2sig(abs(Sz),size(Sz,1));

xz = xz(n/2+(1:n));
xr = xr(n/2+(1:n));

plot(xz)
hold on
plot(xr,'--','LineWidth',2)
hold off
legend('Original','Reconstructed')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Reconstructed.

Повторите вычисления, но теперь уменьшите эффекты кромки, предположив, что x является сегментом сигнала в два раза длиннее.

xx = cos(pi/60*(-n/2:n/2+n-1)')+1;

Sx = stft(xx);
xr = stftmag2sig(abs(Sx),size(Sx,1));

xx = xx(n/2+(1:n));
xr = xr(n/2+(1:n));

plot(xx)
hold on
plot(xr,'--','LineWidth',2)
hold off
legend('Original','Reconstructed')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Reconstructed.

Загрузите аудиосигнал, который содержит два уменьшающихся чирпа и широкополосный брызгающий звук. Сигнал дискретизируется на частоте 8192 Гц. Постройте график STFT сигнала. С помощью окна Хэмминга разделите сигнал на 128 сегментов выборки и окнах сегментов. Укажите 64 образца перекрытия между соседними сегментами и 1024 точками БПФ.

load splat
ty = (0:length(y)-1)/Fs;

% To hear, type sound(y,Fs)

wind = hamming(128);
olen = 64;
nfft = 1024;

stft(y,Fs,'Window',wind,'OverlapLength',olen,'FFTLength',nfft)

Figure contains an axes. The axes with title Short-Time Fourier Transform contains an object of type image.

Вычислите величину и фазу STFT.

s = stft(y,Fs,'Window',wind,'OverlapLength',olen,'FFTLength',nfft);

smag = abs(s);
sphs = angle(s);

Реконструируйте сигнал на основе величины STFT. Используйте те же параметры, которые использовались для вычисления STFT. По умолчанию stftmag2sig инициализирует фазы до нуля и использует 100 итераций оптимизации.

[x,tx,info] = stftmag2sig(smag,nfft,Fs,'Window',wind,'OverlapLength',olen);

% To hear, type sound(x,Fs)

Постройте график исходных и восстановленных сигналов. Для лучшего сравнения сместите восстановленный сигнал вверх и вправо.

plot(ty,y,tx+500/Fs,x+1)
legend('Original','Reconstructed','Location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Reconstructed.

Выведите относительное улучшение в сторону сходимости между двумя последними итерациями.

impr = info.Inconsistency
impr = 0.0424

Улучшите реконструкцию, удвоив число итераций оптимизации и установив для начальных фаз фактические фазы из STFT. Постройте график исходных и восстановленных сигналов. Для лучшего сравнения постройте график негатива восстановленного сигнала и смещите его вверх и вправо.

[x,tx,info] = stftmag2sig(smag,nfft,Fs,'Window',wind,'OverlapLength',olen, ...
    'MaxIterations',200,'InitialPhase',sphs);

% To hear, type sound(x,Fs)

plot(ty,y,tx+500/Fs,-x+1)
legend('Original','Reconstructed','Location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Original, Reconstructed.

Выведите относительное улучшение в сторону сходимости между двумя последними итерациями.

impr = info.Inconsistency
impr = 1.3874e-16

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

свернуть все

Величина STFT, заданная как матрица. s должен соответствовать одноканальному действительному сигналу.

Пример: abs(stft(sin(pi/2*(0:255)),'FFTLength',128)) задает величину STFT синусоиды.

Пример: abs(stft(chirp(0:1/1e3:1,25,1,50))) задает величину STFT чирпа, дискретизированного на частоте 1 кГц.

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

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

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

Частота выборки, заданная как положительный числовой скаляр.

Время выборки, указанное как duration скаляр. Определение ts эквивалентно установке частоты выборки fs = 1/ts.

Пример: seconds(1) является duration скаляр, представляющий 1-секундную разность времени между последовательными выборками сигнала.

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

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: 'FrequencyRange','onesided','InitializePhaseMethod','random' указывает, что сигнал восстанавливается из одностороннего STFT со случайными начальными фазами.

Опция отображения несогласованности, заданная как разделенная запятыми пара, состоящая из 'Display' и логическое значение. Если для этой опции установлено значение true, то stftmag2sig отображает нормализованную несогласованность после каждых 20 итераций оптимизации, а также отображает информацию об остановке в конце выполнения.

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

Частотный диапазон величины STFT, определяемый как разделенная запятыми пара, состоящая из 'FrequencyRange' и 'centered', 'twosided', или 'onesided'.

  • 'centered' - Лечить s как величина двустороннего, центрированного STFT. Если nfft является четным, то s считается, что он был вычислен за интервал (-δ, δ] рад/выборка. Если nfft является нечетным, то s вычисляется на протяжении интервала (-δ, δ) рад/выборка. Если указать временную информацию, то интервалы будут (-fs, fs/2] циклами/единичным временем и (-fs, fs/2) циклами/единичным временем соответственно, где fs - частота выборки.

  • 'twosided' - Лечить s как величина двустороннего STFT, вычисленного на интервале [0, ) рад/выборка. Если указать информацию о времени, то интервал будет равен [0, fs) циклам/единицам времени.

  • 'onesided' - Лечить s как величина одностороннего STFT. Если nfft является четным, то s вычисляется за интервал [0, δ] рад/выборка. Если nfft является нечетным, то s вычисляется на протяжении интервала [0, δ) рад/выборка. При указании временной информации интервалы составляют [0, fs/2] циклов/единичного времени и [0, fs/2) циклов/единичного времени соответственно, где fs - частота выборки.

Типы данных: char | string

Допуск несоответствия процесса реконструкции, определяемый как разделенная запятыми пара, состоящая из 'InconsistencyTolerance' и положительный скаляр. Процесс реконструкции останавливается, когда нормализованная несогласованность ниже допуска.

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

Инициализация фазы, указанная как разделенная запятыми пара, состоящая из 'InitializePhaseMethod' и 'zeros' или 'random'. Укажите только один из 'InitializePhaseMethod' или 'InitialPhase'.

  • 'zeros' - Функция инициализирует фазы как нули.

  • 'random' - функция инициализирует фазы как случайные числа, равномерно распределенные в интервале [-δ, λ].

Типы данных: char | string

Начальные фазы, указанные как разделенная запятыми пара, состоящая из 'InitialPhase' и вещественной числовой матрицей в диапазоне [-δ, δ]. Матрица должна иметь тот же размер, что и s. Укажите только один из 'InitializePhaseMethod' или 'InitialPhase'.

Пример: angle(stft(randn(1000,1))) определяет фазы кратковременного преобразования Фурье случайного сигнала.

Пример: 2*pi*(rand(size(stft(randn(1000,1))))-1/2) задает матрицу случайных фаз, равномерно распределенных в интервале [-δ, λ]. Матрица имеет тот же размер, что и кратковременное преобразование Фурье случайного сигнала.

.

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

Измерение входного времени, указанное как пара, разделенная запятыми, состоящая из 'InputTimeDimension' и 'acrosscolumns' или 'downrows'.

  • 'acrosscolumns' - Функция предполагает, что измерение времени s находится поперек столбцов, а измерение частоты - вниз по строкам.

  • 'downrows' - Функция предполагает, что измерение времени s находится вниз по строкам, а измерение частоты - поперек столбцов.

Типы данных: char | string

Максимальное число итераций оптимизации, указанное как пара, разделенная запятыми, состоящая из 'MaxIterations' и положительный целочисленный скаляр. Процесс реконструкции останавливается, когда число итераций превышает 'MaxIterations'.

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

Алгоритм восстановления сигнала, определяемый как разделенная запятыми пара, состоящая из 'Method' и один из них:

  • 'gla' - Оригинальный алгоритм реконструкции, предложенный Гриффином и Лимом и описанный в [1].

  • 'fgla' - быстрый алгоритм Гриффина-Лима, предложенный Перраудином, Балазсом и Сёндергаардом и описанный в [2].

  • 'legla' - быстрый алгоритм, предложенный Le Roux, Kameoka, Ono и Sagayama и описанный в [3].

Типы данных: char | string

Количество перекрывающихся выборок между соседними сегментами, указанное как пара, разделенная запятыми, состоящая из 'OverlapLength' и положительное целое число, меньшее длины 'Window'. Для успешного восстановления сигнала требуется 'OverlapLength' для соответствия количеству перекрывающихся сегментов, используемых для генерации величины STFT. Если опустить 'OverlapLength' или укажите его как пустое, оно будет иметь наибольшее целое число, меньшее или равное 75% длины окна, что составляет 96 выборок для окна Ханна по умолчанию.

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

Порядок усечения для 'legla' правило обновления, указанное как пара, разделенная запятыми, состоящая из 'TruncationOrder' и положительное целое число. Этот аргумент применяется только в том случае, если 'Method' имеет значение 'legla' и управляет количеством значений фазы, обновленных в каждой итерации этого метода. Если не указано, 'TruncationOrder' определяется с помощью адаптивного алгоритма.

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

Обновить параметр для быстрого алгоритма Гриффина-Лима, указанного как разделенная запятыми пара, состоящая из 'UpdateParameter' и положительный скаляр. Этот аргумент применяется только в том случае, если 'Method' имеет значение 'fgla' и задает параметр для правила обновления этого метода.

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

Спектральное окно, указанное как разделенная запятыми пара, состоящая из 'Window' и вектор. Для успешного восстановления сигнала требуется 'Window' для соответствия окну, используемому для генерации величины STFT. Если окно не указано или указано как пустое, функция использует периодическое окно Ганна длиной 128. Длина 'Window' должно быть больше или равно 2.

Список доступных окон см. в разделе Windows.

Пример: hann(128,'periodic') и (1-cos(2*pi*(128:-1:1)'/128))/2 оба задают окно по умолчанию, используемое stftmag2sig.

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

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

свернуть все

Восстановленный сигнал временной области, возвращаемый как вектор.

Моменты времени, в которые восстанавливается сигнал, возвращаются в виде вектора.

Информация о процессе реконструкции, возвращенная в виде структуры, содержащей следующие поля:

  • ExitFlag - Флаг завершения.

    • Значение 0 указывает, что алгоритм остановлен при достижении максимального количества итераций.

    • Значение 1 указывает, что алгоритм остановлен, когда он соответствует относительному допуску.

  • NumIterations - общее число итераций.

  • Inconsistency - среднее относительное улучшение к сходимости между двумя последними итерациями.

  • ReconstructedPhase - Реконструированная фаза на последней итерации.

  • ReconstructedSTFT - Реконструированное кратковременное преобразование Фурье на последней итерации.

Подробнее

свернуть все

Нормализованная несогласованность

Нормализованная несогласованность измеряет улучшение в направлении сходимости процесса реконструкции в последовательных итерациях оптимизации.

Нормализованная несогласованность определяется как

Inconsistency=‖STFT (ISTFT (sest)) sest ‖ sest ‖,

где sest - комплексное кратковременное преобразование Фурье, оцененное на каждой итерации, скобки обозначают матричную норму, STFT обозначает кратковременное преобразование Фурье, а ISTFT обозначает его обратное. stftmag2sig использует функцию MATLAB ®norm для вычисления матричных норм. Дополнительные сведения о STFT и его обратном преобразовании см. в разделах Короткое время преобразования Фурье и Обратное короткое преобразование Фурье.

Ссылки

[1] Гриффин, Дэниел У. и Чжэ С. Лим. «Оценка сигнала из модифицированного кратковременного преобразования Фурье». Транзакции IEEE для обработки акустики, речи и сигналов. Том 32, номер 2, апрель 1984, стр. 236-243. https://doi.org/10.1109/TASSP.1984.1164317.

[2] Перраудин, Натанаэль, Петер Балаз и Петер Л. Сёндергаард. «Быстрый алгоритм Гриффина-Лима». В 2013 году семинар IEEE по применению обработки сигналов к аудио и акустике, Нью-Пальц, Нью-Йорк, 20-23 октября 2013 года. https://doi.org/10.1109/WASPAA.2013.6701851.

[3] Ле Ру, Джонатан, Хирокадзу Камеока, Нобутака Оно и Сигэки Сагаяма. «Быстрое восстановление сигнала из спектрограммы STFT на основе согласованности спектрограмм». В трудах 13-й Международной конференции по цифровым аудиоэффектам (DAFx-10), Грац, Австрия, 6-10 сентября 2010 года.

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

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

.

См. также

Функции

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