imdct

Инверсия изменила дискретное косинусное преобразование

Синтаксис

X = imdct(Y,win)
X = imdct(Y,win,Name,Value)

Описание

пример

X = imdct(Y,win) возвращает инверсию изменила дискретное косинусное преобразование (IMDCT) Y, сопровождаемого умножением с окном win времени и сложением перекрытия кадров с 50%-м перекрытием.

X = imdct(Y,win,Name,Value) наборы каждое свойство Name к заданному Value. Незаданные свойства имеют значения по умолчанию.

Примеры

свернуть все

Читайте в звуковом файле, преобразуйте его в моно, и затем постройте его.

audioIn = audioread('FunkyDrums-44p1-stereo-25secs.mp3');
audioIn = mean(audioIn,2);

figure(1)
plot(audioIn,'bo')
ylabel('Amplitude')
xlabel('Sample Number')

Вычислите MDCT использование окна синуса с 4096 точками. Постройте степень коэффициентов MDCT в зависимости от времени.

N = 4096;
wdw = sin(pi*((1:N)-0.5)/N);

C = mdct(audioIn,wdw);

figure(2)
surf(20*log10(C.*conj(C)),'EdgeColor','none');
view([0 90])
xlabel('Frame')
ylabel('Frequency')
axis([0 size(C,2) 0 size(C,1)])
colorbar

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

audioReconstructed = imdct(C,wdw);
err = mean((audioIn-audioReconstructed(1:size(audioIn,1),:)).^2)

figure(1)
hold on
plot(audioReconstructed,'r.')
ylabel('Amplitude')
xlabel('Sample Number')
err =

   9.5933e-31

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

Читайте в звуковом файле, создайте окно Kaiser-Bessel-derived с 2048 точками, и затем отсеките звуковой сигнал так, чтобы его длина была кратной 2 048.

[x,fs] = audioread('Click-16-44p1-mono-0.2secs.wav');
win = kbdwin(2048);

xClipped = x(1:end - rem(size(x,1),numel(win)));

Преобразуйте сигнал в частотный диапазон, и затем восстановите его назад во временном интервале. Постройте исходные и восстановленные сигналы и отобразите ошибку реконструкции.

C = mdct(xClipped,win);
y = imdct(C,win);

figure(1)
t = (0:size(xClipped,1)-1)'/fs;
plot(t,xClipped,'bo',t,y,'r.')
legend('Original Signal','Reconstructed Signal')
title(strcat("Reconstruction Error = ",num2str(mean((xClipped-y).^2))))
xlabel('Time (s)')
ylabel('Amplitude')

Можно выполнить MDCT и IMDCT без входного дополнения с помощью пары "имя-значение" PadInput. Однако будет ошибка реконструкции в первом полукадре и продлится полукадр сигнала.

C = mdct(xClipped,win,'PadInput',false);
y = imdct(C,win,'PadInput',false);

figure(2)
t = (0:size(xClipped,1)-1)'/fs;
plot(t,xClipped,'bo',t,y,'r.')
legend('Original Signal','Reconstructed Signal')
title(strcat("Reconstruction Error (Without Input Padding) = ",num2str(mean((xClipped-y).^2))))
xlabel('Time (s)')
ylabel('Amplitude')

Если вы задаете входной сигнал к mdct, который не является кратным длине окна, то входной сигнал дополнен нулями. Передайте исходный неотсеченный сигнал через пару преобразования и сравните исходный сигнал и восстановленный сигнал.

C = mdct(x,win);
y = imdct(C,win);

figure(3)

subplot(2,1,1)
plot(x)
title('Original Signal')
ylabel('Amplitude')
axis([0,max(size(y,1),size(x,1)),-0.5,0.5])

subplot(2,1,2)
plot(y)
title('Reconstructed Signal')
xlabel('Time (s)')
ylabel('Amplitude')
axis([0,max(size(y,1),size(x,1)),-0.5,0.5])

Восстановленный сигнал дополнен нулями в бэкэнде. Удалите дополнение нуля из восстановленного сигнала, постройте исходный и восстановленный сигнал, и затем отобразите ошибку реконструкции.

figure(4)
y = y(1:size(x,1));
t = (0:size(x,1)-1)'/fs;
plot(t,x,'bo',t,y,'r.')
legend('Original Signal','Reconstructed Signal')
title(strcat("Reconstruction Error = ",num2str(mean((x-y).^2))))
xlabel('Time (s)')
ylabel('Amplitude')

Создайте объект dsp.AudioFileReader читать в покадровых аудиоданных. Создайте dsp.SignalSink, чтобы регистрировать восстановленный сигнал для сравнения. Создайте dsp.AsyncBuffer, чтобы буферизовать входной поток.

fileReader = dsp.AudioFileReader('FunkyDrums-44p1-stereo-25secs.mp3');
logger = dsp.SignalSink;
buff = dsp.AsyncBuffer;

Создайте окно Kaiser-Bessel-derived с 512 точками.

N = 512;
win = kbdwin(N);

В цикле аудиопотока:

  1. Считайте кадр данных из файла.

  2. Запишите кадр данных к асинхронному буферу.

  3. Если половина кадра данных присутствует, читайте из буфера и затем выполните пару преобразования. Перекрытие - добавляет текущую производительность от imdct с предыдущим выводом и регистрирует результаты. Обновите память.

mem = zeros(N/2,2); % initialize an empty memory

while ~isDone(fileReader)
    audioIn = fileReader();
    write(buff,audioIn);

    while buff.NumUnreadSamples >= N/2
        x = read(buff,N,N/2);
        C = mdct(x,win,'PadInput',false);
        y = imdct(C,win,'PadInput',false);

        logger(y(1:N/2,:)+mem)
        mem = y(N/2+1:end,:);
    end

end

% Perform the transform pair one last time with a zero-padded final signal.
x = read(buff,N,N/2);
C = mdct(x,win,'PadInput',false);
y = imdct(C,win,'PadInput',false);
logger(y(1:N/2,:)+mem)

reconstructedSignal = logger.Buffer;

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

[originalSignal,fs] = audioread(fileReader.Filename);
signalLength = size(originalSignal,1);
reconstructedSignal = reconstructedSignal((N/2+1):(N/2+1)+signalLength-1,:);

t = (0:size(originalSignal,1)-1)'/fs;
plot(t,originalSignal(:,1),'bo',t,reconstructedSignal(:,1),'r.')
legend('Original Signal','Reconstructed Signal')
title(strcat("Reconstruction Error = ", ...
      num2str(mean((originalSignal-reconstructedSignal).^2,'all'))))
xlabel('Time (s)')
ylabel('Amplitude')

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

свернуть все

Измененное дискретное косинусное преобразование (MDCT), заданное как вектор, матрица или трехмерный массив. Размерности Y интерпретированы, как выведено от функции mdct. Если Y является L-by-M-by-N массив, размерности интерпретированы как:

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

  • M NumberOfFrames .

  • N Количество каналов.

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

Окно применяется во временном интервале, заданном как вектор. Длина победы должна быть дважды количеством строк Y: numel(win)==2*size(Y,1). Чтобы включить совершенную реконструкцию, используйте то же окно, используемое в прямом преобразовании mdct.

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

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

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

Пример: 'PadInput',false

Флаг, если введено к прямому mdct был дополнен. Если установлено в true, вывод является усеченным в обоих концах, чтобы удалить дополнение нуля что прямой добавленный mdct.

Типы данных: логический

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

свернуть все

Инверсия изменила дискретное косинусное преобразование (IMDCT) входного массива Y, возвращенный как вектор-столбец или матрица независимых каналов.

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

Алгоритмы

Измененное дискретное косинусное преобразование инверсии является частотой времени, преобразовывают. Учитывая входной сигнал частотного диапазона Y и окно win, функция imdct выполняет, выполняет шаги для каждого независимого канала:

  1. Каждый кадр входа преобразован в представление временного интервала:

    X(n)=k=0N21Y(k)потому что[π(N2)(n+(N2)+12)(k+12)],n=0,1,...,N1

    где N является числом элементов в win.

  2. Каждый кадр сигнала временного интервала умножается на окно, win.

  3. Кадры добавляются в перекрытие с 50%-м перекрытием, чтобы создать непрерывный сигнал временного интервала. Если PadInput установлен в истину, функция imdct принимает, что исходный входной сигнал в прямом преобразовывает (mdct), был дополнен N/2 нули на передней и задней части и удаляет дополнение. По умолчанию PadInput установлен в true.

Ссылки

[1] Princen, J., А. Джонсон и А. Брэдли. "Кодирование поддиапазона/Преобразования Используя Проекты Набора фильтров На основе области Времени Искажение Отмены". Международная конференция IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP). 1987, стр 2161–2164.

[2] Princen, J. и А. Брэдли. "Проект Набора фильтров анализа/Синтеза На основе области Времени Искажение Отмены". Транзакции IEEE на Акустике, Речи и Обработке сигналов. Издание 34, Выпуск 5, 1986, стр 1153–1161.

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

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

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

| |

Введенный в R2019a