imdct

Обратное модифицированное дискретное косинусоидальное преобразование

Описание

пример

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

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

Примеры

свернуть все

Прочтите в аудио файла, преобразуйте его в mono, а затем постройте график.

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. The axes 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. The axes 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. The axes contains 2 objects of type line.

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

Считайте в аудиосигнале файла, создайте окно, полученное Кайзером-Бесселем с 2048 точками, и затем клипсируйте аудиосигнал так, чтобы его длина была кратна 2048.

[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;

Создайте окно с 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. The axes 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 -- Количество систем координат.

  • 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 добавлен.

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

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

свернуть все

Обратное модифицированное дискретное косинусоидальное преобразование (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 установлено значение true, imdct функция принимает исходный входной сигнал в прямом преобразовании (mdct) был заполнен N/2 нулями спереди и сзади и удаляет заполнение. По умолчанию PadInput установлено в true.

Ссылки

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

[2] Принсен, Дж., и А. Брэдли. Проект банка фильтров анализа/синтеза, основанный на отмене псевдонимизации во временном интервале. Транзакции IEEE по акустике, речи и обработке сигналов. Том 34, Выпуск 5, 1986, стр. 1153-1161.

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

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

.
Введенный в R2019a