randomly picking some files
    4 ビュー (過去 30 日間)
  
       古いコメントを表示
    
I want to pick some .wav files randomly from a certain directory without replacement or with no repititions .. how is that possible ? please help me in this regard
採用された回答
  Image Analyst
      
      
 2013 年 9 月 10 日
        You can get a directory and then use randperm to get a list of random, non-repeated indexes, or randi to get a list of possibly repeated indexes, or you can use this program I wrote that will play either a random wave file or one that you specify:
% Play a wav file.  You can pass in 'random' and it will pick one at random from the folder to play.
% PlaySoundFile(handles.soundFolder, 'chime.wav');
% PlaySoundFile(handles.soundFolder, 'random');
function PlaySoundFile(soundFolder, baseWavFileName)
  try        % Read the sound file into MATLAB, and play the audio.
%     soundFolder = fullfile(soundFolder, 'Sound Files');
    if ~exist(soundFolder, 'dir')
        warningMessage = sprintf('Warning: sound folder not found:\n%s', soundFolder);
        WarnUser(warningMessage);
        return;
    end
    if strcmpi(baseWavFileName, 'random')
      itWorked = false;
      tryCount = 1;
      while itWorked == false
        % Pick a file at random.
        filePattern = fullfile(soundFolder, '*.wav');
        waveFiles = dir(filePattern);
        numberOfFiles = length(waveFiles);
        % Get a random number
        fileToPlay = randi(numberOfFiles, 1);
        baseWavFileName = waveFiles(fileToPlay).name;
        fullWavFileName = fullfile(soundFolder, baseWavFileName);
        waveFileData = -1;
        try
          if exist(fullWavFileName, 'file')
            [waveFileData, Fs, nbits, readinfo] = wavread(fullWavFileName);
            sound(waveFileData, Fs);
            %     soundsc(y,Fs,bits,range);
          else
            warningMessage = sprintf('Warning: sound file not found:\n%s', fullWavFileName);
            WarnUser(warningMessage);
          end
          % It worked.  It played because the audio format was OK.
          itWorked = true;
        catch
          % Increment the try count and try again to find a file that plays.
          tryCount = tryCount + 1;
          if tryCount >= numberOfFiles
            break;
          end
        end
      end % of while()
    else
  %     baseWavFileName = 'Chime.wav';
      fullWavFileName = fullfile(soundFolder, baseWavFileName);
      waveFileData = -1;
      if exist(fullWavFileName, 'file')
        [waveFileData, Fs, nbits, readinfo] = wavread(fullWavFileName);
        sound(waveFileData, Fs);
        %     soundsc(y,Fs,bits,range);
      else
        warningMessage = sprintf('Warning: sound file not found:\n%s', fullWavFileName);
        WarnUser(warningMessage);
      end
    end
  catch ME
    if strfind(ME.message, '#85')
      % Unrecognized format.  Play chime instead.      
      fprintf('Error in PlaySoundFile(): %s.\nUnrecognized sound format in file:\n\n%s\n', ME.message, fullWavFileName);
       baseWavFileName = 'Chime.wav';
      fullWavFileName = fullfile(soundFolder, baseWavFileName);
      waveFileData = -1;
      if exist(fullWavFileName, 'file')
        [waveFileData, Fs, nbits, readinfo] = wavread(fullWavFileName);
        sound(waveFileData, Fs);
        %     soundsc(y,Fs,bits,range);
      end
    end
    errorMessage = sprintf('Error in PlaySoundFile().\nThe error reported by MATLAB is:\n\n%s', ME.message);
    fprintf('%s\n', errorMessage);
    WarnUser(errorMessage);
  end
  return; % from PlaySoundFile
By the way, WarnUser is simply
function WarnUser(message)
uiwait(warndlg(message));
11 件のコメント
  sabrina lenglet
 2017 年 6 月 21 日
				
      編集済み: Walter Roberson
      
      
 2017 年 6 月 21 日
  
			% Play a wav file.  You can pass in 'random' and it will pick one at random from the folder to play.
% PlaySoundFile(handles.soundFolder, 'chime.wav');
% PlaySoundFile(handles.soundFolder, 'random');
function PlaySoundFile(soundFolder, baseWavFileName)
  try        % Read the sound file into MATLAB, and play the audio.
     %soundFolder = fullfile(soundFolder, 'Sound Files');
    if ~exist(soundFolder, 'dir')
        warningMessage = sprintf('Warning: sound folder not found:\n%s', soundFolder);
        WarnUser(warningMessage);
        return;
    end
    if strcmpi(baseWavFileName, 'random')
      itWorked = false;
      tryCount = 1;
      while itWorked == false
        % Pick a file at random.
        filePattern = fullfile(soundFolder, '*.wav');
        waveFiles = dir(filePattern);
        numberOfFiles = length(waveFiles);
        % Get a random number
        fileToPlay = randi(numberOfFiles, 1);
        baseWavFileName = waveFiles(fileToPlay).name;
        fullWavFileName = fullfile(soundFolder, baseWavFileName);
         waveFileData = -1;
        try
          if exist(fullWavFileName, 'file')
            [waveFileData, Fs, ~, ~] = audioread(fullWavFileName);
            sound(waveFileData, Fs);
            %     soundsc(y,Fs,bits,range);
          else
            warningMessage = sprintf('Warning: sound file not found:\n%s', fullWavFileName);
            WarnUser(warningMessage);
          end
          % It worked.  It played because the audio format was OK.
          itWorked = true;
        catch
          % Increment the try count and try again to find a file that plays.
          tryCount = tryCount + 1;
          if tryCount >= numberOfFiles
            break;
          end
        end
      end % of while()
    else
  %     baseWavFileName = 'Chime.wav';
%         baseWavFileName = 'sinus1300.wav';
      fullWavFileName = fullfile(soundFolder, baseWavFileName);
      waveFileData = -1;
      if exist(fullWavFileName, 'file')
        [waveFileData, Fs, ~, ~] = audioread(fullWavFileName);
        sound(waveFileData, Fs);
            %soundsc(y,Fs,bits,range);
      else
        warningMessage = sprintf('Warning: sound file not found:\n%s', fullWavFileName);
        WarnUser(warningMessage);
      end
    end
  catch ME
    if strfind(ME.message, '#85')
      % Unrecognized format.  Play chime instead.      
      fprintf('Error in PlaySoundFile(): %s.\nUnrecognized sound format in file:\n\n%s\n', ME.message, fullWavFileName);
       baseWavFileName = 'sinus1300.wav';
%    efface sab         baseWavFileName = 'Chime.wav';
      fullWavFileName = fullfile(soundFolder, baseWavFileName);
      waveFileData = -1;
      if exist(fullWavFileName, 'file')
        [waveFileData, Fs, ~, ~] = audioread(fullWavFileName);
        sound(waveFileData, Fs);
        %     soundsc(y,Fs,bits,range);
            end  
          end
  %     errorMessage = sprintf('Error in PlaySoundFile().\nThe error reported by MATLAB is:\n\n%s', ME.message);
  %     fprintf('%s\n', errorMessage);
  %     WarnUser(errorMessage);
    end
    return; % from PlaySoundFile
その他の回答 (2 件)
  Azzi Abdelmalek
      
      
 2013 年 9 月 10 日
        your_folder='E:\matlab';
d=dir([your_folder '\*.wav']);
f={d.name};
n=numel(f);
idx=randi(numel(f));
file=f{idx}
f(idx)=[];
2 件のコメント
  Walter Roberson
      
      
 2013 年 9 月 10 日
        Yes. If your file names are in the cell array FileNames then
shuffleidx = randperm(length(fileNames));
for K = 1 : length(suffleidx)
  thisfile = fileNames{shuffleidx(K)}
  ...
end
0 件のコメント
参考
カテゴリ
				Help Center および File Exchange で Audio I/O and Waveform Generation についてさらに検索
			
	Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!




