How to use MATLAB to search through inputs and return an answer

2 Ansichten (letzte 30 Tage)
Drake
Drake am 27 Apr. 2015
Kommentiert: Drake am 27 Apr. 2015
This is probably a really bad way to ask this question. I am not even really sure what it would be called besides a goal seek. I have written a code to analyze a frequency played on a phone or musical instrument, really anything. I have it so it will return what frequency is played but I want it to return what note is being played instead. Is there a better way to do this than just a bunch of if statements? I have included a sample of my code. It shows the name of the input, the transform, how to get the frequency, and some of the values for the frequencies.
myrecording = getaudiodata(recobj); %analyzes the recording
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
n=length(myrecording)-1; f=0:fs/n:fs;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
A=abs(fft(myrecording)); figure(2) plot(f,A)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
[X,Y] = max(A);
F = (Y/3)-(0.497);
fprintf('The frequency in hertz is %.2f\n',F)
C2 = 65.41; D2 = 69.30; E2 = 73.42; F2 = 87.31; G2 = 98; A2 = 110; B2 = 123.47; C3 = 130.81; D3 = 146.83; E3 = 164.81; F3 = 174.61; G3 = 196; A3 = 220; B3 = 246.94;

Akzeptierte Antwort

Stephen23
Stephen23 am 27 Apr. 2015
Bearbeitet: Stephen23 am 27 Apr. 2015
Rather than thinking about each note as being its own individual variable, this is much simpler when we realize that they are all instances of one set of data "notes", so they should be stored together. So keep the data in two vectors, one numeric for the frequencies and one cell for the note strings, with corresponding entries:
freq_vec = [65.41, 69.30, 73.42, 87.31, ...];
note_vec = { 'C2', 'D2', 'E2', 'F2', ...};
then you can simply locate the closest frequency to a sample frequency by using min:
freq_val = 70;
[~,idx] = min(abs(freq_vec - freq_val));
and you can simply get the note string:
>> note_vec{idx}
ans = 'D2'
Putting the numeric values together in one vector will make any operation that you care to attempt much easier, from numeric or arithmetic operations, to searches and matching.
  2 Kommentare
Jan
Jan am 27 Apr. 2015
Exactly. Using a pile of variables with pseudo-indices inside is much more complicated than storing the set of values in a vector.
Drake
Drake am 27 Apr. 2015
Thanks! That's exactly what I was looking for.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by