imdct

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

Описание

пример

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')

Figure contains an axes object. The axes object contains an object of type line.

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

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

C = mdct(audioIn,wdw);

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

Figure contains an axes object. The axes object contains an object of type surface.

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

audioReconstructed = imdct(C,wdw);
err = mean((audioIn-audioReconstructed(1:size(audioIn,1),:)).^2)
err = 9.5937e-31
figure(1)
hold on
plot(audioReconstructed,'r.')
ylabel('Amplitude')
xlabel('Sample Number')

Figure contains an axes object. The axes object contains 2 objects of type line.

Включить совершенную реконструкцию, 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')

Figure contains an axes object. The axes object with title Reconstruction Error = 2.0761e-32 contains 2 objects of type line. These objects represent Original Signal, Reconstructed Signal.

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

свернуть все

Модифицированное дискретное косинусное преобразование (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,Value аргументы. 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)cos[π(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