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)потому что[π(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