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

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

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

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

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

свернуть все

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

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

| | | | | |

Введенный в R2019a