mdct

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

Синтаксис

Y = mdct(X,win)
Y = mdct(X,win,Name,Value)
[Y,S,Z] = 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 использование окна Kaiser-Bessel-derived с 1024 точками.

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

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

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

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

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

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

свернуть все

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

  • N Количество каналов, равняйтесь size(X,2).

Запаздывающие одноэлементные размерности удалены из вывода Y.

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

Измененный дискретный синус преобразовывает (MDST), возвращенный как вектор, матрица или трехмерный массив. Размерности S совпадают с MDCT вывод, Y.

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

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

Чтобы создать полный (двухсторонний) ODFT, зеркально отразите полупримкнутый ODFT: cat(1,Z,conj(flip(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)потому что[π(N2)(n+(N2)+12)(k+12)],k=0,1,...,(N2)1

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

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

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

Y(k)=e{Yo(k)}потому что(π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] Princen, J., А. Джонсон и А. Брэдли. "Кодирование поддиапазона/Преобразования Используя Проекты Набора фильтров На основе области Времени Искажение Отмены". Международная конференция IEEE по вопросам Акустики, Речи и Обработки сигналов (ICASSP). 1987, стр 2161–2164.

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

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

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

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

| |

Введенный в R2019a