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

Вычислите 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)
err = 9.5937e-31
figure(1)
hold on
plot(audioReconstructed,'r.')
ylabel('Amplitude')
xlabel('Sample Number')

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