2011-01-21 6 views
5

Je crée un fichier à lire dans un certain nombre de fichiers .wav, chacun correspondant à une note musicale. J'effectue une FFT sur chacun d'eux et les traçant tous sur la même figure. Cependant, j'ai un problème avec l'impression correcte de la légende, c'est la séparation des noms que je veux utiliser en lettres individuelles au lieu de les utiliser comme une chaîne. Mon code est le suivant:Matlab Legend after FOR boucle

clear all 
mydir = 'Note Values/'; 
wavFiles = dir([mydir '*.wav']); 
length(wavFiles) 

legendText = []; 
figure(1); 
hold on; 
for i = 1:length(wavFiles) 

    wavFiles(i).name 
    [y, fs] = wavread([mydir wavFiles(i).name]); 
    sound(y, fs) 

    currentSample = y(round(length(y)/2)-2048:round(length(y)/2)+2047); 

    FFT = abs(fft(currentSample)); 
    Power = FFT.*conj(FFT)/length(FFT); 

    if (mod(i, 2) == 1) 
     h = plot(Power, 'Color', 'red'); 

    else 
     h = plot(Power, 'Color', 'blue'); 
    end 

    sri = wavFiles(i).name; 
    sri 
    legendText = [legendText, sri]; 

end 
length(legendText) 
legendText(1) 
legend(legendText(:)); 
hold off; 

La variable est toujours une SRI chaîne complète, mais LegendText (1) n'imprime A au lieu de A3.wav. Je sais que c'est probablement quelque chose de vraiment évident mais je n'arrive pas à le trouver. Merci

La sortie sur mon graphique apparaît comme ceci: alt text

+0

En note, il semble que vous devez tracer l'axe des ordonnées sur une échelle logarithmique plutôt que linéaire. Utilisez la fonction 'semilogy' ou simplement:' set (gca, 'YScale', 'log') '... – Amro

Répondre

3

Vous devez utiliser

legendText{i} = sri 

pour remplir la cellule avec des cordes et

legend(legendText{:}); 

à la fin.

+0

Merci beaucoup, je savais que ça allait être quelque chose de petit. – Joneser

+1

En ce qui concerne les chaînes: array ne peut contenir que des caractères (qui forment une chaîne). Pour obtenir plusieurs chaînes, les cellules sont la solution. –

1

Je n'ai pas Matlab par moi, donc je ne suis pas en mesure de le tester, mais je me souviens bien, vous devez utiliser {au lieu de [:

legendText = {legendText, sri}; 
+0

J'ai déjà essayé d'utiliser les parenthèses {} et il en résulte que legendText (1) contient {1x2 cell} résulte dans l'erreur suivante. Erreur lors de l'utilisation de ==> legend> process_inputs à 560 L'argument de tableau de cellules doit être un tableau de chaînes de chaînes. Et le deuxième élément dans le tableau de cellules est le nom du dernier fichier traité. – Joneser

+0

En faisant cela, vous créez une cellule contenant une cellule et une chaîne. –