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 имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

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

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

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

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

свернуть все

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

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

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

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

    • Если PadInput установлен в false, M = перекрывают (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: кошка (1, Z, союз (щелчок (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

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

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

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

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

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

| |

Введенный в R2019a