matlabsignalsguitar

What's wrong with my code in Matlab?


I want to play all frequencies given in matrix(FrTm) with its duration.The actual duration is one second but each frequency has to play for 3 of 1/18 and 6 of 1/18 seocnd such as given in matrix(FrTm).

 function Music()
Fs=44100;
T=1/Fs;
M = zeros(1,88);
for I=7:88,
M(I) = round(36.8*(2^(1/12))^(I-6));
end
Signal=[];

FrTm=[50,3;50,3;52,3;54,3;50,3;54,3;52,3;45,3;50,3;50,3;52,3;54,3;50,6;
49,3;1,3;50,3;50,3;52,3;54,3;55,3;54,3;52,3;50,3;49,3;45,3;47,3;49,3;50,6;
50,3;1,3;47,5;49,1;47,3;45,3;47,3;49,3;50,3;1,3;45,5;47,1;45,3;43,3;42,6;
45,3;1,3;47,5;49,1;47,3;45,3;47,3;49,3;50,3;47,3;45,3;50,3;49,3;52,3;50,6;
50,6];

t=0:1/18:1;

for i=1:length(FrTm),
M(i)=FrTm(i);
Z=M(i);

data= sin(2*pi*Z/Fs*t);

signal=[data;signal];
end

stem(Signal);
sound (Signal, 44100);

end

Solution

  • The classical way to make a sound with a given frequency (f) and sample frequency (Fs) is to make a time vector with step 1/Fs:

    time = 0:1/Fs:D;
    

    Where Dis the duration of the signal. The signal itself is then:

    signal = sin(2*pi*f.*time)
    

    In this case the total time is fixed, not the time of each signal. The total time is denoted with T, and the total time vector is made as

    time = 0:1/Fs:T;
    

    The sum of the second column is the total number of units the vector time needs to be divided in, e.g. 50, 3 means that a signal at 50 Hz needs to be played for 3 units. This means we only need a time vector of the length of 3 units:

    t = time(1:floor(end*duration/s));
    

    Where duration is the number of units for this part and s is the total number of units. The signal is then simply, as stated above,

    data = sin(2*pi*f*t);
    

    The data is then appended to the whole signal. The complete code, looks like this:

    Fs = 44100; % sample frequency [Hz]
    T = 3; % total duration [s]
    time = 0:1/Fs:T;
    
    % matrix with frequencies and duration
    FrTm=[50,3;50,3;52,3;54,3;50,3;54,3;52,3;45,3;50,3;50,3;52,3;54,3;50,6;
    49,3;1,3;50,3;50,3;52,3;54,3;55,3;54,3;52,3;50,3;49,3;45,3;47,3;49,3;50,6;
    50,3;1,3;47,5;49,1;47,3;45,3;47,3;49,3;50,3;1,3;45,5;47,1;45,3;43,3;42,6;
    45,3;1,3;47,5;49,1;47,3;45,3;47,3;49,3;50,3;47,3;45,3;50,3;49,3;52,3;50,6;
    50,6];
    
    s = sum(FrTm(:,2));
    
    [m, ~] = size(FrTm);
    signal = [];
    
    for i=1:m
        freq = FrTm(i,1);
        duration = FrTm(i,2);
    
        t = time(1:floor(end*duration/s));
    
        data = 10*sin(2*pi*freq.*t);
        signal = [data signal];
    end
    
    stem(signal);
    sound(signal, 44100);
    

    Note instead of declaring time in the beginning, it is possible to make a new vector each time you run through the loop. In that case omit time = 0:1/Fs:T; and change t = time(1:floor(end*duration/s)); to t = 0:1/Fs:floor(end*duration/s);