transform

Преобразуйте audio datastore

Описание

пример

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

пример

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

Примеры

свернуть все

Укажите путь к файлу для выборок аудио, включенных в Audio Toolbox™. Создайте audio datastore, который указывает на указанную папку.

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

Функции transform создать новый datastore, который смешивает многоканальные сигналы с mono.

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
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. Создайте audio datastore, который указывает на указанную папку.

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

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

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 установите на заданную функцию.

ADSnew = transform(ADS,@extractSegment,'IncludeInfo',true)
ADSnew = 
  TransformedDatastore with properties:

      UnderlyingDatastores: {audioDatastore}
    SupportedOutputFormats: [1x16 string]
                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 чтобы создать audio datastore, который возвращает представление mel spectrogram из read функция.

Укажите путь к файлу для выборок аудио, включенных в Audio Toolbox™. Создайте audio datastore, который указывает на указанную папку.

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

Задайте функцию, которая преобразует аудио данных из представления во временной области в журнал mel spectrogram. Функция добавляет дополнительные выходы от melSpectrogram функцию в информационный struct, выводимую из чтения audio datastore.

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:

      UnderlyingDatastores: {audioDatastore}
    SupportedOutputFormats: [1x16 string]
                Transforms: {@extractMelSpectrogram}
               IncludeInfo: 1

Прочтите первые три аудио файлов и постройте график журнала mel spectrograms. Если существует несколько каналов, постройте график только первого канала.

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

Figure contains an axes. The axes with title Ambiance-16-44p1-mono-12secs contains an object of type surface.

Figure contains an axes. The axes with title AudioArray-16-16-4channels-20secs contains an object of type surface.

Figure contains an axes. The axes with title ChurchImpulseResponse-16-44p1-mono-5secs contains an object of type surface.

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

Укажите путь к файлу для выборок аудио, включенных в Audio Toolbox™. Создайте audio 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);

    % Concatenate 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:

      UnderlyingDatastores: {audioDatastore}
    SupportedOutputFormats: [1x16 string]
                Transforms: {@extractFeatureVector}
               IncludeInfo: 1

Функции read для возврата векторов функций для аудио с течением времени.

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

        4215


numFeatures =

    11

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

Укажите путь к файлу для выборок аудио, включенных в Audio Toolbox™. Создайте audio 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:

      UnderlyingDatastores: {audioDatastore}
    SupportedOutputFormats: [1x16 string]
                Transforms: {@applyBandpassFilter}
               IncludeInfo: 1

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

[audio1,info1] = read(ADS);
[audio2,info2] = read(ADSnew);
spectrogram(audio1,hann(512),256,512,info1.SampleRate,'yaxis')
title('Original Signal')

Figure contains an axes. The axes with title Original Signal contains an object of type image.

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

Figure contains an axes. The axes with title Filtered Signal contains an object of type image.

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

свернуть все

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

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

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

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

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

свернуть все

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

См. также

| | | | | |

Введенный в R2019a