istft

Обратное кратковременное преобразование Фурье

Описание

x = istft(s) возвращает обратное кратковременное преобразование Фурье (ISTFT) s.

пример

x = istft(s,fs) возвращает ISTFT s использование частоты дискретизации fs.

x = istft(s,ts) возвращает ISTFT, использующий шаг расчета ts.

пример

x = istft(___,Name,Value) задает аргументы пары "имя-значение" использования дополнительных опций. Опции включают длину окна FFT и количество перекрытых выборок. Эти аргументы могут быть добавлены к любому из предыдущих входных синтаксисов.

пример

[x,t] = istft(___) возвращает времена сигнала, в которые оценен ISTFT.

Примеры

свернуть все

Сгенерируйте сигнал с тремя каналами, состоящий из трех различных щебетов, произведенных на уровне 1 кГц в течение 1 секунды.

  1. Первый канал состоит из вогнутого квадратичного щебета с мгновенной частотой 100 Гц в t = 0 и пересекает 300 Гц в t = 1 секунда. Это имеет начальную фазу, равную 45 градусам.

  2. Второй канал состоит из выпуклого квадратичного щебета с мгновенной частотой 200 Гц в t = 0 и пересекает 600 Гц в t = 1 секунда.

  3. Третий канал состоит из логарифмического щебета с мгновенной частотой 300 Гц в t = 0 и пересекает 500 Гц в t = 1 секунда.

Вычислите STFT многоканального сигнала с помощью периодического Окна Хэмминга длины 256 и продолжительности перекрытия 15 выборок.

fs = 1e3;
t = 0:1/fs:1-1/fs;
x = [chirp(t,100,1,300,'quadratic',45,'concave');
      chirp(t,200,1,600,'quadratic',[],'convex');
      chirp(t,300,1,500,'logarithmic')]'; 
  
[S,F,T] = stft(x,fs,'Window',hamming(256,'periodic'),'OverlapLength',15);

Постройте исходные и восстановленные версии первых и вторых каналов.

[ix,ti] = istft(S,fs,'Window',hamming(256,'periodic'),'OverlapLength',15);

plot(t,x(:,1)','LineWidth',1.5)
hold on
plot(ti,ix(:,1)','r--')
hold off
legend('Original Channel 1','Reconstructed Channel 1')

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

plot(t,x(:,2)','LineWidth',1.5)
hold on
plot(ti,ix(:,2)','r--')

legend('Original Channel 2','Reconstructed Channel 2')

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

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

Вокодер фазы берет STFT сигнала с аналитическим окном размера транзитного участка R1 и затем выполняет ISTFT с окном синтеза размера транзитного участка R2. Вокодер таким образом использует в своих интересах метод ВОЛИ. К фрагменту времени сигнал аналитическое окно использует большее число выборок перекрытия, чем синтез. В результате существует больше выборок при выходе, чем во входе (NS,Out>NS,In), несмотря на то, что содержимое частоты остается то же самое. Теперь можно передать шкалу этот сигнал путем воспроизведения его на уровне более высокой частоты дискретизации, которая производит сигнал с исходной продолжительностью, но более высоким тангажом.

Загрузите звуковой файл, содержащий фрагмент "Хора Аллилуйи Генделя", произведенного на уровне 8 192 Гц.

load handel

Спроектируйте корневое-Hann окно длины 512. Установите аналитическую длину перекрытия как 192 и длину перекрытия синтеза как 166.

wlen = 512;
win = sqrt(hann(wlen,'periodic'));
noverlapA = 192;
noverlapS = 166;

Реализуйте вокодер фазы при помощи аналитического окна перекрытия 192 и окна синтеза перекрытия 166.

S = stft(y,Fs,'Window',win,'OverlapLength',noverlapA);
iy = istft(S,Fs,'Window',win,'OverlapLength',noverlapS);


%To hear, type soundsc(w,Fs), pause(10), soundsc(iw,Fs);

Если окна анализа и синтеза будут тем же самым, но длина перекрытия изменяется, будет дополнительное усиление/потеря, которое необходимо будет настроить. Это - общий подход к реализации вокодера фазы.

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

hopRatio = (wlen-noverlapS)/(wlen-noverlapA);
iyg = iy*hopRatio;
Fp = Fs*hopRatio;


%To hear, type soundsc(iwg,Fs), pause(15), soundsc(iwg,Fp);

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

plot((0:length(iyg)-1)/Fs,iyg,(0:length(y)-1)/Fs,y)
xlabel('Time (s)')
xlim([0 (length(iyg)-1)/Fs])
legend('Time Stretched Signal with Fixed Gain','Original Signal','Location','best')

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Time Stretched Signal with Fixed Gain, Original Signal.

Сравните растянутый во времени сигнал и тангаж переключенный сигнал на том же графике.

plot((0:length(iy)-1)/Fs,iy,(0:length(iy)-1)/Fp,iy)
xlabel('Time (s)')
xlim([0 (length(iyg)-1)/Fs])
legend('Time Stretched Signal','Pitch Shifted Signal','Location','best') 

Figure contains an axes. The axes contains 2 objects of type line. These objects represent Time Stretched Signal, Pitch Shifted Signal.

Чтобы лучше изучить эффект данных о сдвигающем тангажа, считайте следующую синусоиду частоты Fs более чем 2 секунды.

t =  0:1/Fs:2;
x = sin(2*pi*10*t);

Вычислите кратковременное преобразование Фурье и обратное кратковременное преобразование Фурье с длинами перекрытия 192 и 166 соответственно.

Sx = stft(x,Fs,'Window',win,'OverlapLength',noverlapA);
ix = istft(Sx,Fs,'Window',win,'OverlapLength',noverlapS);

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

subplot(2,1,1)
plot((0:length(ix)-1)/Fs,ix,'LineWidth',2) 
xlabel('Time (s)')
ylabel('Signal Amplitude')
xlim([0 (length(ix)-1)/Fs])
legend('Time Stretched Signal') 



subplot(2,1,2)
hold on
plot((0:length(x)-1)/Fs,x)
plot((0:length(ix)-1)/Fp,ix,'--','LineWidth',2)
legend('Original Signal','Pitch Shifted Signal','Location','best')
hold off
xlabel('Time (s)')
ylabel('Signal Amplitude')
xlim([0 (length(ix)-1)/Fs])

Figure contains 2 axes. Axes 1 contains an object of type line. This object represents Time Stretched Signal. Axes 2 contains 2 objects of type line. These objects represent Original Signal, Pitch Shifted Signal.

Сгенерируйте комплексную синусоиду частоты 1 кГц и длительности 2 секунды.

fs = 1e3;
ts = 0:1/fs:2-1/fs;

x = exp(2j*pi*100*cos(2*pi*2*ts));

Спроектируйте периодическое окно Hann длины 100 и определите номер выборок перекрытия к 75. Проверяйте окно и длину перекрытия для податливости COLA.

nwin = 100;
win = hann(nwin,'periodic');
noverlap = 75;

tf = iscola(win,noverlap)
tf = logical
   1

Нулевая клавиатура сигнал удалить краевые эффекты. Чтобы избежать усечения, заполните входной сигнал нулями, таким образом что

length(xZero)-noverlapnwin-noverlapДлина сигнала минус перекрытие по длине окна минус перекрытие

целое число. Установите длину БПФ на 128. Вычислите кратковременное преобразование Фурье комплексного сигнала.

nPad = 100;
xZero = [zeros(1,nPad) x zeros(1,nPad)];
fftlen = 128;
s = stft(xZero,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen);

Вычислите обратное кратковременное преобразование Фурье и удалите нули для совершенной реконструкции.

[is,ti] = istft(s,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen);
is(1:nPad) = [];
is(end-nPad+1:end) = [];
ti = ti(1:end-2*nPad);

Постройте действительные части исходных и восстановленных сигналов. Мнимая часть сигнала также восстановлена отлично.

plot(ts,real(x))
hold on
plot(ti,real(is),'--')
xlim([0 0.5])
xlabel('Time (s)')
ylabel('Amplitude (V)')
legend('Original Signal','Reconstructed Signal') 
hold off

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

Сгенерируйте синусоиду, произведенную на уровне 2 кГц в течение 1 секунды.

fs = 2e3;
t = 0:1/fs:1-1/fs;
x = 5*sin(2*pi*10*t);

Спроектируйте периодическое Окно Хэмминга длины 120. Проверяйте ограничение COLA на окно с перекрытием 80 выборок. Комбинацией перекрытия окна является совместимый COLA.

win = hamming(120,'periodic');
noverlap = 80;
tf = iscola(win,noverlap)
tf = logical
   1

Установите длину БПФ на 512. Вычислите кратковременное преобразование Фурье.

fftlen = 512;
s = stft(x,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen);

Вычислите обратное кратковременное преобразование Фурье.

[X,T] = istft(s,fs,'Window',win,'OverlapLength',noverlap,'FFTLength',fftlen,'Method','ola','ConjugateSymmetric',true);

Постройте исходные и восстановленные сигналы.

plot(t,x,'b')
hold on
plot(T,X,'-.r')
xlabel('Time (s)')
ylabel('Amplitude (V)')
title('Original and Reconstructed Signal')
legend('Original Signal','Reconstructed Signal')
hold off

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

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

свернуть все

Кратковременное преобразование Фурье в виде матрицы или трехмерного массива. Для одноканальных сигналов задайте s как матрица со временем, увеличиваясь через столбцы и частоту, увеличивающую вниз строки. Для многоканальных сигналов задайте s как трехмерный массив с третьей размерностью, соответствующей каналам. Частота и временные векторы получены как выходные параметры stft.

Примечание

Если вы инвертируете s использование istft и хочу результат быть той же длиной как x, значение (length(x)-noverlap)/(length(window)-noverlap) должно быть целое число.

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

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

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

Шаг расчета в виде a duration скаляр.

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

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

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

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

Пример: istft(s,'Window',win,'OverlapLength',50,'FFTLength',128) окна данные с помощью окна win, с 50 выборками перекрываются между смежными сегментами и 128 точками ДПФ.

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

Для списка доступных окон смотрите Windows.

Пример: hann(N+1) и (1-cos(2*pi*(0:N)'/N))/2 оба задают окно Hann длины N  + 1.

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

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

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

Количество ДПФ указывает в виде разделенной запятой пары, состоящей из 'FFTLength' и положительное целое число. Чтобы достигнуть совершенной реконструкции временного интервала, необходимо определить номер точек ДПФ, чтобы совпадать с используемым в stft.

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

Метод перекрытия - добавляет в виде разделенной запятой пары, состоящей из 'Method' и один из них:

  • 'wola' — Взвешенное перекрытие - добавляет

  • 'ola' — Перекрытие - добавляет

Сопряженная симметрия исходного сигнала в виде разделенной запятой пары, состоящей из 'ConjugateSymmetric' и true или false. Если эта опция установлена в true, istft принимает что вход s симметрично, в противном случае никакое симметричное предположение не сделано. Когда s не точно сопряжен симметричный из-за ошибки округления, устанавливая пару "имя-значение" на true гарантирует, что STFT обработан, как будто это было сопряжено симметричный. Если s сопряжен симметричный, затем обратный расчет преобразования быстрее, и выход действителен.

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

  • 'centered' — Обработайте s как двухсторонний, сосредоточенный STFT. Если nfft является четным, затем s считается вычисленным на интервале (–π, π] рад/отсчет. Если nfft является нечетным, затем s считается вычисленным на интервале (–π, π) рад/отсчет. Если вы указываете информацию времени, то интервалы (–fs, f s/2] циклы/единица времени и (–fs, f s/2) циклы/единица времени, соответственно, где f s является частотой дискретизации.

  • 'twosided' — Обработайте s как двухсторонний STFT, вычисленный на интервале [0, 2π) рад/отсчет. Если вы указываете информацию времени, то интервал [0, f s), циклы/единица времени.

  • 'onesided' — Обработайте s как односторонний STFT. Если nfft является четным, затем s считается вычисленным на интервале [0, π] рад/отсчет. Если nfft является нечетным, затем s считается вычисленным на интервале [0, π), рад/отсчет. Если вы указываете информацию времени, то интервалы являются [0, f s/2] циклами/единицей времени и [0, f s/2), циклы/единица времени, соответственно, где f s является частотой дискретизации.

    Примечание

    Когда этот аргумент установлен в 'onesided', istft принимает, что значения в положительной области значений Найквиста были вычислены, не сохраняя общую степень.

Для примера см. Частотные диапазоны STFT.

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

Введите измерение времени в виде разделенной запятой пары, состоящей из 'InputTimeDimension' и 'acrosscolumns' или 'downrows'. Если это значение установлено к 'downrows', istft принимает что измерение времени s снижается на строки, и частота через столбцы. Если это значение установлено к 'acrosscolumns', функция istft принимает что измерение времени s через столбцы, и размерность частоты снижается на строки.

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

свернуть все

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

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

Моменты времени, возвращенные как вектор.

  • Если частота дискретизации fs обеспечивается, затем t содержит временные стоимости в секундах.

  • Если длительность ts обеспечивается, затем t имеет тот же формат времени как входная длительность и массив длительности.

  • Если никакая информация времени не предоставляется, то t содержит демонстрационные числа.

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

Больше о

свернуть все

Обратное кратковременное преобразование Фурье

Обратное кратковременное преобразование Фурье вычисляется путем взятия ОБПФ каждого вектора ДПФ из STFT и добавления перекрытия инвертированные сигналы. ISTFT вычисляется можно следующим образом:

x(n)=1/21/2m=Xm(f)ej2πfndf=m=1/21/2Xm(f)ej2πfndf=m=xm(n)

где R размер транзитного участка между последовательными ДПФ, Xm ДПФ оконных данных, сосредоточенных во время mR и xm(n)=x(n)g(nmR). Обратный STFT является совершенной реконструкцией исходного сигнала пока m=ga+1(nmR)=cn где analysis window g(n) использовался к окну исходный сигнал и c константа. Следующая фигура изображает шаги, выполненные в восстановлении исходного сигнала.

Постоянное перекрытие - добавляет (COLA) ограничение

Чтобы гарантировать успешную реконструкцию немодифицированных спектров, аналитическое окно должно удовлетворить ограничению COLA. В общем случае, если аналитическое окно удовлетворяет условию m=ga+1(nmR)=cn, окно считается совместимым КОЛОЙ. Кроме того, податливость COLA может быть описана или как слабая или как сильная.

  • Слабая податливость COLA подразумевает, что преобразование Фурье аналитического окна имеет нули в гармониках частоты кадров, таким образом что

    G(fk)=0,k=1,2,,R1,fkkR.

    Отмена псевдонима нарушена спектральными модификациями. Слабый COLA использует отмену псевдонима в частотном диапазоне. Поэтому совершенная реконструкция является возможным использованием слабо совместимых КОЛОЙ окон, пока сигнал не подвергся никаким спектральным модификациям.

  • Для сильной податливости COLA преобразование Фурье окна должно последовательно быть bandlimited с субдискретизацией частотой кадров, таким образом что

    G(f)=0,f12R.

    Это уравнение показывает, что никакое искажение не позволено сильным ограничением COLA. Кроме того, для сильной податливости COLA, значения константы c должен равняться 1. В общем случае, если кратковременный спектр изменяется в каком-либо случае, более сильный COLA, совместимое окно предпочтено.

Можно использовать iscola функционируйте, чтобы проверять на слабую податливость COLA. Количество суммирования, используемого, чтобы проверить соответствие COLA, диктуют длина окна и размер транзитного участка. В общем случае распространено использовать a=1 \in m=ga+1(nmR)=cn для взвешенного перекрытия - добавляют (ВОЛЯ), и a=0 для перекрытия - добавляют (OLA). По умолчанию, istft использует метод ВОЛИ, путем применения synthesis window прежде, чем выполнить метод перекрытия-суммы.

В общем случае окно синтеза совпадает с аналитическим окном. Можно создать полезные окна ВОЛИ путем пущения квадратного корня из сильного окна OLA. Можно использовать этот метод для всех неотрицательных окон OLA. Например, корневое-Hann окно является хорошим примером окна ВОЛИ.

Совершенная реконструкция

В общем случае вычисление STFT входного сигнала и инвертирование его не приводят к совершенной реконструкции. Если вы хотите, чтобы выход ISTFT совпадал с исходным входным сигналом максимально тесно, сигнал и окно должны удовлетворить следующим условиям:

  • Введите размер — Если вы инвертируете выход stft использование istft и хочу результат быть той же длиной как входной сигнал x, значение k = (length(x)-noverlap)(length(window)-noverlap) должно быть целое число.

  • Податливость COLA — Использование совместимые КОЛОЙ окна, принимая, что вы не изменили кратковременное преобразование Фурье сигнала.

  • Дополнение — Если длина входного сигнала такова, что значение k не является целым числом, нулевая клавиатура сигнал прежде, чем вычислить кратковременное преобразование Фурье. Удалите дополнительные нули после инвертирования сигнала.

Ссылки

[1] Crochiere, R. E. "Взвешенный Метод перекрытия-суммы Кратковременного Анализа/Синтеза Фурье". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 28, Номер 1, февраль 1980, стр 99–102.

[2] Gotzen, A. D. Н. Бернардини и Д. Арфиб. "Традиционные реализации вокодера фазы: приемы торговли". Продолжения COST G-6 конференция по эффектам цифрового аудио (DAFX-00), Вероне, Италия, 7-9 декабря 2000.

[3] Гриффин, Дэниел В. и Джэ С. Лим. "Оценка сигнала от Модифицированного Кратковременного преобразования Фурье". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 32, Номер 2, апрель 1984, стр 236–243.

[4] Портнофф, M. R. "Представление частоты времени Цифровых сигналов и Систем На основе Кратковременного анализа Фурье". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 28, Номер 1, февраль 1980, стр 55–69.

[5] Смит, Джулиус Орайон. Спектральная Обработка Звукового сигнала. https://ccrma.stanford.edu / ~ jos/sasp/, онлайновая книга, 2 011 выпусков, получил доступ к ноябрю 2018.

[6] Шарп, Брюс. Обратимость Перекрытия - Добавляет Обработку. https://gauss256.github.io/blog/cola.html, получил доступ к июлю 2019.

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

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

Функции

Введенный в R2019a