exponenta event banner

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 функция zero-pads передние и задние части входного аудиосигнала. Сигнал, возвращенный из 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. Если присутствует половина кадра данных, считывайте из буфера и затем выполняйте преобразование пары. Перекрытие (Overlap) - добавление токового вывода из 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

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

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

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

свернуть все

Модифицированное дискретное косинусное преобразование (MDCT), возвращаемое как вектор, матрица или 3-D массив. Размеры 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 -- количество каналов, равное size(X,2).

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

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

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

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

Полустороннее нечетное дискретное преобразование Фурье (ODFT), возвращаемое как вектор, матрица или 3-D массив комплексных чисел. Размеры 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=0N−1X (n) cos [δ (N2) (n + (N2) + 12) (k + 12)], k = 0,1,..., (N2) − 1

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

YO (k) =∑n=0N−1X (n) e júnN (2k + 1), k = 0,1,..., N − 1

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

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

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

X (k) =ℑm{Xo (k)} син (ø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