exponenta event banner

imdct

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

Описание

пример

X = imdct(Y,win) возвращает обратное измененное дискретное косинусное преобразование (IMDCT) Y, с последующим умножением на временное окно win и наложение-добавление кадров с 50% перекрытием.

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

Примеры

свернуть все

Прочитайте аудиофайл, преобразуйте его в моно, а затем постройте график.

audioIn = audioread('FunkyDrums-44p1-stereo-25secs.mp3');
audioIn = mean(audioIn,2);

figure(1)
plot(audioIn,'bo')
ylabel('Amplitude')
xlabel('Sample Number')

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

Вычислите MDCT с помощью синусоидального окна 4096 точек. Постройте график мощности коэффициентов MDCT во времени.

N = 4096;
wdw = sin(pi*((1:N)-0.5)/N);

C = mdct(audioIn,wdw);

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

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

Преобразуйте представление обратно во временную область. Проверьте идеальное свойство реконструкции путем вычисления среднеквадратичной ошибки. Постройте график восстановленного сигнала над исходным сигналом.

audioReconstructed = imdct(C,wdw);
err = mean((audioIn-audioReconstructed(1:size(audioIn,1),:)).^2)
err = 9.5937e-31
figure(1)
hold on
plot(audioReconstructed,'r.')
ylabel('Amplitude')
xlabel('Sample Number')

Figure contains an axes. The axes contains 2 objects of type line.

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

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

свернуть все

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

  • L - количество точек в представлении частотной области каждого кадра. L должно быть вдвое меньше количества точек в окне, win.

  • M - количество кадров.

  • N - количество каналов.

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

Окно, примененное во временной области, указанное как вектор. Длина выигрыша должна в два раза превышать количество рядов Y: numel(win)==2*size(Y,1). Чтобы обеспечить идеальную реконструкцию, используйте то же окно, что и при прямом преобразовании mdct.

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

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

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

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

Флаг при вводе в прямой канал mdct был заполнен. Если установлено значение true, выход усекается на обоих концах, чтобы удалить заполнение нуля, что вперед mdct добавлено.

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

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

свернуть все

Обратное модифицированное дискретное косинусное преобразование (IMDCT) входного массива Y, возвращается в виде вектора столбца или матрицы независимых каналов.

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

Алгоритмы

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

  1. Каждый кадр входного сигнала преобразуется в представление временной области:

    X (n) =∑k=0N2−1Y (k) cos [δ (N2) (n + (N2) + 12) (k + 12)], n = 0,1,..., N − 1

    где N - количество элементов в win.

  2. Каждый кадр сигнала временной области умножается на окно, win.

  3. Кадры добавляются с наложением на 50% для построения непрерывного сигнала временной области. Если PadInput имеет значение true, imdct функция принимает исходный входной сигнал в прямом преобразовании (mdct) был дополнен нолями N/2 на передней и задней части и удаляет набивку. По умолчанию PadInput имеет значение true.

Ссылки

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

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

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

Создание кода C/C + +
Создайте код C и C++ с помощью MATLAB ® Coder™

.

См. также

| |

Представлен в R2019a