преобразовать

Преобразуйте аудио datastore

Синтаксис

transformDatastore = transform(ADS,@fcn)
transformDatastore = transform(ADS,@fcn,Name,Value)

Описание

пример

transformDatastore = transform(ADS,@fcn) создает новый datastore, который преобразовывает вывод от функции read.

пример

transformDatastore = transform(ADS,@fcn,Name,Value) задает опции с помощью одного или нескольких аргументов пары Name,Value.

Примеры

свернуть все

Задайте путь к файлу к аудиосэмплам, включенным с Audio Toolbox™. Создайте аудио datastore, который указывает на заданную папку.

folder = fullfile(matlabroot,'toolbox','audio','samples');
ADS = audioDatastore(folder);

Вызовите transform, чтобы создать новый datastore, который смешивает многоканальные сигналы к моно.

ADSnew = transform(ADS,@(x)mean(x,2));

Читайте из нового datastore и подтвердите что он только выходные параметры моно сигналы.

while hasdata(ADSnew)
    audio = read(ADSnew);
    fprintf('Number of channels = %d\n',size(audio,2))
end
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1
Number of channels = 1

Аудиосэмплы, включенные с Audio Toolbox™, имеют переменную длительность. Используйте функцию transform, чтобы настроить функцию read так, чтобы это вывело случайный пятисекундный сегмент аудиосэмплов.

Задайте путь к файлу к аудиосэмплам, включенным с Audio Toolbox. Создайте аудио datastore, который указывает на заданную папку.

folder = fullfile(matlabroot,'toolbox','audio','samples');
ADS = audioDatastore(folder);

Задайте функцию, extractSegment, чтобы взять в качестве входа вывод функции read. Заставьте extractSegment извлечь ценность пяти секунд данных из звукового сигнала.

%--------------------------------------------------------------------------
function [dataOut,info] = extractSegment(audioIn,info)
    [N,numChan] = size(audioIn);
    newN = round(info.SampleRate*5);
    if newN > N                                % signal length < 5 seconds
        numPad = newN - N + 1;
        dataOut = [audioIn;zeros(numPad,numChan,'like',audioIn)];
    elseif newN < N                            % signal length > 5 seconds
        start = randi(N - newN + 1);
        dataOut = audioIn(start:start+newN-1,:);
    else                                       % signal length == 5 seconds 
        dataOut = audioIn;
    end
end
%--------------------------------------------------------------------------

Вызовите transform, чтобы создать TransformedDatastore с набором Transforms к extractSegment.

ADSnew = transform(ADS,@extractSegment,'IncludeInfo',true)
ADSnew = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1x1 audioDatastore]
             Transforms: {@extractSegment}
            IncludeInfo: 1

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

for i = 1:3
    [audio,info] = read(ADSnew);
    fprintf('Duration = %d seconds\n',size(audio,1)/info.SampleRate)
end
Duration = 5 seconds
Duration = 5 seconds
Duration = 5 seconds

Используйте transform, чтобы создать аудио datastore, который возвращает mel представление спектрограммы от функции read.

Задайте путь к файлу к аудиосэмплам, включенным с Audio Toolbox™. Создайте аудио datastore, который указывает на заданную папку.

folder = fullfile(matlabroot,'toolbox','audio','samples');
ADS = audioDatastore(folder);

Задайте функцию, extractMelSpectrogramSegment, который преобразовывает аудиоданные от представления временного интервала до журнала mel спектрограмма. Добавьте дополнительные выходные параметры от функции melSpectrogram до информационного struct вывод от read.

function [dataOut,infoOut] = extractMelSpectrogram(audioIn,info)

    [S,F,T] = melSpectrogram(audioIn,info.SampleRate);
    
    dataOut = 10*log10(S+eps);
    infoOut = info;
    infoOut.CenterFrequencies = F;
    infoOut.TimeInstants = T;
end

Вызовите transform, чтобы создать TransformedDatastore с набором Transforms к extractMelSpectrogram.

ADSnew = transform(ADS,@extractMelSpectrogram,'IncludeInfo',true)
ADSnew = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1x1 audioDatastore]
             Transforms: {@extractMelSpectrogram}
            IncludeInfo: 1

Считайте первые три звуковых файла и постройте журнал mel спектрограммы. Если существует несколько каналов, строят только первый канал.

for i = 1:3
    [melSpec,info] = read(ADSnew);

    figure(i)
    surf(info.TimeInstants,info.CenterFrequencies,melSpec(:,:,1),'EdgeColor','none');
    xlabel('Time (s)')
    ylabel('Frequency (Hz)')
    [~,name] = fileparts(info.FileName);
    title(name)
    axis([0 info.TimeInstants(end) info.CenterFrequencies(1) info.CenterFrequencies(end)])
    view([0,90])
end

Используйте transform, чтобы создать аудио datastore, который возвращает характеристические векторы.

Задайте путь к файлу к аудиосэмплам, включенным с Audio Toolbox™. Создайте аудио datastore, который указывает на заданную папку.

folder = fullfile(matlabroot,'toolbox','audio','samples');
ADS = audioDatastore(folder);

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

function [dataOut,info] = extractFeatureVector(audioIn,info)

    % Convert to frequency-domain representation
    windowLength = 256;
    overlapLength = 128;
    [~,f,~,S] = spectrogram(mean(audioIn,2), ...
                            hann(windowLength,"Periodic"), ...
                            overlapLength, ...
                            windowLength, ...
                            info.SampleRate, ...
                            "power", ...
                            "onesided");

    % Extract features
    [kurtosis,spread,centroid] = spectralKurtosis(S,f);
    skewness = spectralSkewness(S,f);
    crest    = spectralCrest(S,f);
    decrease = spectralDecrease(S,f);
    entropy  = spectralEntropy(S,f);
    flatness = spectralFlatness(S,f);
    flux     = spectralFlux(S,f);
    rolloff  = spectralRolloffPoint(S,f);
    slope    = spectralSlope(S,f);

    % Concantenate to create feature vectors
    dataOut = [kurtosis,spread,centroid,skewness,crest,decrease,entropy,flatness,flux,rolloff,slope];

end

Вызовите transform, чтобы создать TransformedDatastore с набором Transforms к extractFeatureVector.

ADSnew = transform(ADS,@extractFeatureVector,'IncludeInfo',true)
ADSnew = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1x1 audioDatastore]
             Transforms: {@extractFeatureVector}
            IncludeInfo: 1

Вызовите read, чтобы возвращать характеристические векторы для аудио в зависимости от времени.

featureMatrix = read(ADSnew);
[numFeatureVectors,numFeatures] = size(featureMatrix)
numFeatureVectors =

        4215


numFeatures =

    11

Используйте transform, чтобы создать аудио datastore, который применяет полосу пропускания, фильтрующую прежде, чем возвратить аудио в функцию read.

Задайте путь к файлу к аудиосэмплам, включенным с Audio Toolbox™. Создайте аудио datastore, который указывает на заданную папку.

folder = fullfile(matlabroot,'toolbox','audio','samples');
ADS = audioDatastore(folder);

Задайте функцию, applyBandpassFilter, который применяет полосовой фильтр с полосой пропускания между 1 и 15 кГц.

function [audioOut,info] = applyBandpassFilter(audioIn,info)

    audioOut = bandpass(audioIn,[1e3,15e3],info.SampleRate);

end

Вызовите transform, чтобы создать TransformedDatastore с набором Transforms к applyBandpassFilter.

ADSnew = transform(ADS,@applyBandpassFilter,'IncludeInfo',true)
ADSnew = 

  TransformedDatastore with properties:

    UnderlyingDatastore: [1x1 audioDatastore]
             Transforms: {@applyBandpassFilter}
            IncludeInfo: 1

Вызовите read, чтобы возвратиться, полоса пропускания отфильтровала аудио от datastore преобразования. Вызовите read, чтобы возвратиться, полоса пропускания отфильтровала аудио от исходного datastore. Постройте спектрограммы, чтобы визуализировать различие.

[audio1,info1] = read(ADS);
[audio2,info2] = read(ADSnew);


figure(1)
spectrogram(audio1,hann(512),256,512,info1.SampleRate,'yaxis')
title('Original Signal')

figure(2)
spectrogram(audio2,hann(512),256,512,info2.SampleRate,'yaxis')
title('Filtered Signal')

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

свернуть все

Аудио datastore, заданный как объект audioDatastore.

Функция, которая преобразовывает данные, заданные как указатель на функцию. Подпись функции зависит от параметра IncludeInfo.

  • Если IncludeInfo установлен в false (значение по умолчанию), функция преобразовывает аудиовыход от read. Информационный вывод от read неизменен.

    Функция преобразования должна иметь эту подпись:

    function dataOut = fcn(audio)
    ...
    end

  • Если IncludeInfo установлен в true, функция преобразовывает аудиовыход от read, и может использовать или изменить информацию, возвращенную в read.

    Функция преобразования должна иметь эту подпись:

    function [dataOut,infoOut] = fcn(audio,infoIn)
    ...
    end

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

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

Пример: 'IncludeInfo',tf

Передайте информацию через индивидуально настраиваемую функцию чтения, заданную как true или false. Если true, функция преобразования может использовать или изменить информацию, это добирается от read. Если незаданный, значения по умолчанию IncludeInfo к false.

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

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

свернуть все

Новый datastore с индивидуально настраиваемым read, возвращенным как TransformedDatastore с набором UnderlyingDatastore к ADS, набором Transforms к fcn и набором IncludeInfo к true или false.

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

| | | | | |

Введенный в R2019a