Разложение wav/mp3 файла для заливки в дуину

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

Добрый день!

Для использования ф-ии tone в дуине нам необходимы массивы частоты и длины "волны", поиграясь с простым примером toneMelody из папки Digital все станет ясно, но забивать руками эти массивы не камильфо. Вот я и задался вопросом автоматизации процесса, возможно, есть готовые библиотеки или приложения, на вход которым подаем wav/mp3 файл, а на выходе получаем нужные массивы?

Я решил начать с моего любимого Матлаба. Сразу находим нужную функцию wavread('C:/wav_file.wav'), на выходе получим следующее:

>> [y, Fs, nbits] = wavread('C:/m.wav');
>> size(y)

ans =

       89823           2

>> size(Fs)

ans =

     1     1

>> size(nbits)

ans =

     1     1

Значения переменных:

Fs =22050, nbits = 8. Тут все ясно, а вот пример переменной y (в эту переменную загрузили файл):

         0         0
   -0.0078         0
         0         0
         0         0
         0         0
         0         0
         0         0
         0         0
         0         0
         0         0
         0   -0.0078
   -0.0078         0
         0         0
   -0.0078         0
         0         0
         0         0
         0         0
         0         0
   -0.0078         0
         0         0
         0         0
   -0.0078         0

 Что это за магические цифры?

Описание функции wavread и параметров:

y = wavread(filename) loads a WAVE file specified by the string filename, returning the sampled data in y. If filename does not include an extension, wavread appends .wav.

[y, Fs] = wavread(filename) returns the sample rate (Fs) in Hertz used to encode the data in the file.

[y, Fs, nbits] = wavread(filename) returns the number of bits per sample (nbits).

[y, Fs, nbits, opts] = wavread(filename) returns a structure opts of additional information contained in the WAV file. The content of this structure differs from file to file. Typical structure fields include opts.fmt (audio format information) and opts.info (text that describes the title, author, etc.).

И пример из матлаба, который создает wav файл из файла handel.mat, затем проигрывает его.

Код файла handel.mat:

 open handel.mat

ans = 

     y: [73113x1 double]
    Fs: 8192

>> y(1:100)

ans =

         0
   -0.0062
   -0.0750
   -0.0312
    0.0062
    0.0381
    0.0189
   -0.0250
   -0.0312
   -0.0750
   -0.1258
   -0.1443
   -0.1812
   -0.1905
   -0.0750
   -0.0127
   -0.0381
   -0.0750
         0
    0.0750
    0.1258
    0.1812
    0.1505
    0.1258
    0.0812
    0.0566
         0
   -0.0627
   -0.0950
   -0.0381
   -0.0062
   -0.0189
   -0.0750
   -0.0950
   -0.0750
   -0.0750
   -0.0312
   -0.0566
   -0.0189
    0.0250
    0.0566
    0.0566
    0.0250
   -0.0189
    0.0250
    0.1074
    0.1258
    0.0812
    0.0312
    0.0062
   -0.0312
    0.0062
   -0.0062
    0.0250
    0.1197
    0.1505
    0.1628
    0.1628
    0.0504
         0

Код алгоритма:

% Create WAV file in current folder.
load handel.mat
 
hfile = 'handel.wav';
wavwrite(y, Fs, hfile)
clear y Fs
 
% Read the data back into MATLAB, and listen to audio.
[y, Fs, nbits, readinfo] = wavread(hfile);
sound(y, Fs);

% Pause before next read and playback operation.
duration = numel(y) / Fs;
pause(duration + 2)
 
% Read and play only the first 2 seconds.
nsamples = 2 * Fs;
[y2, Fs] = wavread(hfile, nsamples);
sound(y2, Fs);
pause(4)
 
% Read and play the middle third of the file.
sizeinfo = wavread(hfile, 'size');
 
tot_samples = sizeinfo(1);
startpos = tot_samples / 3;
endpos = 2 * startpos;
 
[y3, Fs] = wavread(hfile, [startpos endpos]);
sound(y3, Fs);

Подведу итог: поняв магию этих чисел, можно перевести вавку в массив и закинуть на ардуину, затем проиграть вавку через ардуину. Mp3-шеилд не интересен, хочется поиздеваться таким путем. Спасибо за внимание.

 

 

.c8r
.c8r аватар
Offline
Зарегистрирован: 15.11.2011

Интерес представляют вот эти строки:

[y, Fs, nbits, readinfo] = wavread(hfile);
sound(y, Fs);

и ф-ия sound, вот ее код:

function sound(y,fs,bits)
%SOUND Play vector as sound.
%   SOUND(Y,FS) sends the signal in vector Y (with sample frequency
%   FS) out to the speaker on platforms that support sound. Values in
%   Y are assumed to be in the range -1.0 <= y <= 1.0. Values outside
%   that range are clipped.  Stereo sounds are played, on platforms
%   that support it, when Y is an N-by-2 matrix.
%
%   SOUND(Y) plays the sound at the default sample rate of 8192 Hz.
%
%   SOUND(Y,FS,BITS) plays the sound using BITS bits/sample if
%   possible.  Most platforms support BITS=8 or 16.
%
%   Example:
%     load handel
%     sound(y,Fs)
%   You should hear a snippet of Handel's Hallelujah Chorus.
%
%   See also SOUNDSC, WAVPLAY.

%   Copyright 1984-2009 The MathWorks, Inc.
%   $Revision: 1.1.6.7 $  $Date: 2009/03/13 08:55:30 $

if nargin<1, error('MATLAB:playsnd:invalidInputs','Not enough input arguments.'); end
if nargin<2, fs = 8192; end
if nargin<3, bits = 16; end

% Error handling for fs
if (isempty(fs))
    error('MATLAB:sound:invalidfrequencyinput', ...
           'Frequency must be a scalar\n');
end

% Error handling for bits
if (isempty(bits))
    error('MATLAB:sound:invalidbitdepthinput', ... 
          'The Number of bits must be a scalar.\n');
end

% "Play" silence if y is empty
if (isempty(y))
    return;
end

% Make sure y is in the range +/- 1
y = max(-1,min(y,1));

% Make sure that there's one column
% per channel.
if ndims(y)>2, error('MATLAB:playsnd:twoDimValuesOnly','Requires 2-D values only.'); end
if size(y,1)==1, y = y.'; end

% Verify data is real and double.
if ~isreal(y) || issparse(y) || ~strcmp(class(y), 'double')
    error('MATLAB:playsnd:invalidDataType', 'Audio data must be real and double-precision.');
end

playsnd(y,fs,bits);

 

SOUND(Y,FS) sends the signal in vector Y (with sample frequency FS) out to the speaker on platforms that support sound. Values in Y are assumed to be in the range -1.0 <= y <= 1.0.
 

Что за вектор то такой, этот Y? Нормирование от -1 1 до 0 20000 дает бредовый результат.