Soru sorMatlab da rastgele ses dosyaları açma sorunu
Ody.st tarafından 6 yıl önce soruldu

Merhaba, Matlab konusunda yeniyim. Matlabda bir script üzerine yazdığım kodlar ile A, B, C ve D klasörlerinin her birinde X, Y, Z, T, N gibi ses dosyaları var. Yazdığım kodlar ile A klasöründen X, B klasöründen T, C klasöründen Z ve D klasöründen Y ses dosyalarını çaldırmak istiyorum. Sorunum şu, A klasöründen X çaldıktan sonra B klasöründen tekrar X çalabiliyor. Ya da A dan X çaldıktan sonra B den T çaldıktan sonra C den tekrar T çalabiliyor. Ben bir kere gelen ses bir daha gelmesin istiyorum. Nasıl yapabilirim?

5 Cevap
sayginer Yönetici tarafından 6 yıl önce cevaplandı

Merhaba,
Secim havuzu yerine kendi örneğinizi uyarlayabilirsiniz. burada randperm fonksiyonu ile rastgele tekrar etmeyen vektörler oluşturarak bunları seçim havuzunuz ile eşleştirebilirsiniz (mapping).
 

clc; clear all;
havuz = [1 5 8 36 1 4 8 5 2 3 9] % Secim havuzumuz
sec = randperm(length(havuz),length(havuz)); % Secim rastgele vektoru
for say=1:length(havuz)
secim = havuz(sec(say)) %Secimi gerceklestiriyoruz
end
Ody.st tarafından 6 yıl önce cevaplandı

%% program
for dB = {'minus3dB' } % for each dB value
for Hz = {'4Hz0' '4Hz3' '4Hz6'} % for each Hz value

if should_terminate; break; end % firstly, check if 'Exit' was clicked

path = [base_path '\' dB{1} '\' Hz{1}];
info = dir([path '\*.wav']); % list wav files in the directory
names = {info.name}; % omit everything other than names
count = numel(names); % number of files

%% play files from this dir until the user gives correct answer
while (count > 0)
%% select a file randomly
index = randi(count); % select a random number from 1 to count
name = names{index}; % select file at that index
file = [path '\' name]; % build full path

%% play the file
[y, Fs] = audioread(file); % read file data
player = audioplayer(y, Fs); % prepare a player for it
playblocking(player); % play and wait to the end of the sound

%% decide next action
answer = questdlg(file , title, correct, incorrect, terminate, default);
switch answer
case correct
correct_count = correct_count + 1;
break % continue to next dir
case incorrect
incorrect_count = incorrect_count + 1;
names(index) = []; % remove the processed file
break
case terminate
should_terminate = 1; % request to terminate
break
end % switch
end % while
end % Hz
end % dB

Ody.st tarafından 6 yıl önce cevaplandı

yukarida attigim kodlarda Bir Ses dosyasini tekrar acmamasini istiyorum.. yani bunun gibi 4 tane program var hepsi ayni calisiyor sadece klasorler farkli. o klasorlerden dosyalar secip caliyor. Ama bazilarinda ayni dosya adlari gelmesi mumkun. Ben ayni isimle dosyalar gelmesin istiyorum..

Caglar Yönetici tarafından 6 yıl önce cevaplandı

Kurduğunuz algoritma içine şu şekilde bir çözüm olabilir:
 
%En basa:

 
kullanilan_dosyalar_listesi=strings(0);
%(Kodlarinizla dongu tamamlaniyor ve diger klasore geciliyor.)
names={info.name};
names(ismember(names,kullanilan_dosyalar_listesi))=[]; %liste'deki elemanlari names vektorunden seciyor ve siliyor
%(Diger kodlariniz...)
[y, Fs] = audioread(file);
kullanilan_dosyalar_listesi(end+1)=name;


Elde eşsiz dosya kalmaması sonucunda hata verecektir tabi.
Caglar Yönetici tarafından 6 yıl önce cevaplandı

Ben R2018a'da tanıtılan string veri tipini kullandım, siz 'cell array of character vectors' dedikleri yontemi kullaniyorsunuz. O yontemi pek hatirlamiyorum.
Hata vermemesi için çeşitli yerlerde tür dönüşümü yapmak gerekebilir, şunun gibi:

names=string({info.name});