transform

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

Описание

пример

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);

Задайте функцию, чтобы взять в качестве входа выход 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:

       UnderlyingDatastore: [1x1 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 создать аудио datastore, который возвращает mel представление спектрограммы от read функция.

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

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

Задайте функцию, которая преобразовывает аудиоданные от представления временного интервала до журнала mel спектрограмма. Функция добавляет дополнительные выходные параметры из melSpectrogram функционируйте к информационному struct выход от чтения аудио 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:

       UnderlyingDatastore: [1x1 audioDatastore]
    SupportedOutputFormats: [1x16 string]
                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);

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

       UnderlyingDatastore: [1x1 audioDatastore]
    SupportedOutputFormats: [1x16 string]
                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]
    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')

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

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

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

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

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

свернуть все

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

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

| | | | | |

Введенный в R2019a