mdct

Модифицированное дискретное косинусоидное преобразование

Описание

пример

Y = mdct(X,win) возвращает измененное дискретное косинусоидальное преобразование (MDCT) X. Перед вычислением MDCT, X буферизуется в 50% перекрываемых систем координат, каждый из которых умножается на временное окно win. Функция обрабатывает каждый столбец X как независимый канал.

пример

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

[Y,S,Z] = mdct(___) возвращает измененное дискретное синусоидальное преобразование (MDST), S, и нечетное дискретное преобразование Фурье (ODFT), Z.

Примеры

свернуть все

Считайте в аудио файла и затем вычислите MDCT с помощью 1024-точечного окна Кайзера-Бесселя.

audioIn = audioread('Counting-16-44p1-mono-15secs.wav');

coef = mdct(audioIn,kbdwin(1024));

Постройте график степени коэффициентов MDCT с течением времени.

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

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

Чтобы обеспечить идеальную реконструкцию, 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.

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

свернуть все

Вход массив, заданный как вектор-столбец или матрица. Если задано в виде матрицы, столбцы обрабатываются как независимые аудиоканалы.

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

Окно, примененное во временном интервале, заданное как вектор четной длины. Преобразование, выполненное mdct имеет то же число точек что и win. Чтобы обеспечить идеальную реконструкцию, используйте окно, которое удовлетворяет условию Принсена-Брэдли (wn2+wn+N2=1), например синусоидальное окно или kbdwin.

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

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

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

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

Флаг для дополнения входного массива, заданный как разделенная разделенными запятой парами, состоящая из 'PadInputtrue или false. Если установлено значение trueк входу добавляется заполнение нулями X с обоих концов, чтобы обеспечить идеальную реконструкцию. Количество нулей на каждом конце числено (win)/2.

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

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

свернуть все

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

  • L - Число точек в представлении частотного диапазона каждой системы координат, равное numel (win)/2.

  • M - Количество систем координат, в которых разбит входной массив.

    • Если PadInput установлено в true, M = ceil (2 * size (X, 1 )/numel (win))+1.

    • Если PadInput установлено в false, M = ceil (2 * size (X, 1 )/numel (win))-1.

  • N -- Количество каналов, равное размеру (X,2).

Конечные размеры синглтона удаляются из выхода Y.

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

Модифицированное дискретное синусоидальное преобразование (MDST), возвращаемое в виде вектора, матрицы или трехмерные массивы. Размерности S те же, что и выходы MDCT, Y.

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

Полустороннее нечетное дискретное преобразование Фурье (ODFT), возвращаемое в виде вектора, матрицы или трехмерные массивы комплексных чисел. Размерности Z те же, что и выходы MDCT, Y.

Чтобы создать полный (двусторонний) ODFT, зеркально отобразите двусторонний ODFT: cat (1, Z, conj (щелчок (Z,1))).

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

Алгоритмы

Модифицированное дискретное косинусоидное преобразование является частотно-временным преобразованием. Задан входной сигнал X и оконные win, mdct функция выполняет следующие шаги для каждого независимого канала:

  1. Формат кадра - это количество элементов в заданном окне, N = numel (win). По умолчанию PadInput установлено в true, так что входной сигнал X заполнен нулями N/2 спереди и сзади. Если входной сигнал не делится на N, на задней панели добавляется дополнительное заполнение. После заполнения входной сигнал буферизуется в 50% перекрываемых систем координат.

  2. Каждая система координат буферизованного и заполненного входного сигнала умножается на окно win.

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

    Y(k)=n=0N1X(n)cos[π(N2)(n+(N2)+12)(k+12)],k=0,1,...,(N2)1

Чтобы воспользоваться алгоритмом FFT, MDCT вычисляется первым вычислением нечетного ДПФ:

YO(k)=n=0N1X(n)ejπnN(2k+1),k=0,1,...,N1

и затем вычисление MDCT:

Y(k)=e{Yo(k)}cos(πN(k+12)(1+N2)),k=0,1,...,(N2)1

Если запрашивается второй аргумент от mdct функция, модифицированное дискретное синусоидальное преобразование (MDST) также вычисляется и возвращается:

X(k)=m{Xo(k)}sin(πN(k+12)(1+N2)),k=0,1,...,(N2)1

Ссылки

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

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

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

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

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