exponenta event banner

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

Преобразовать хранилище аудиоданных

Описание

пример

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

пример

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

Примеры

свернуть все

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

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

Звонить transform для создания нового хранилища данных, которое смешивает многоканальные сигналы с моно.

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

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

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

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 для создания хранилища аудиоданных, которое возвращает представление спектрограммы mel из read функция.

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

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

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

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

Прочитайте первые три аудиофайла и распечатайте спектрограммы log 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

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 Toolbox™. Создайте хранилище аудиоданных, указывающее на указанную папку.

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 для создания хранилища аудиоданных, которое применяет полосовую фильтрацию перед возвратом аудиосигнала из read функция.

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

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 для возврата полосового отфильтрованного звука из хранилища данных преобразования. Звонить read для возврата полосового отфильтрованного звука из исходного хранилища данных. Постройте график спектрограмм, чтобы визуализировать разницу.

[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.

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

свернуть все

Хранилище аудиоданных, указанное как 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

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

свернуть все

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

См. также

| | | | | |

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