What's wrong with my code in Matlab?

87 Views Asked by At

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
3

There are 3 best solutions below

13
ViG On BEST ANSWER

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);

0
Tayyab Khan Shinwari On
 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];

for i=1:length(FrTm),
%---------------------------------------------------
% complete the function

freq = FrTm(i,1);
duration = FrTm(i,2);
time =0:1/Fs:1;  % change the 1 to change total duration

s = sum(FrTm(:,2));
t = time(1:floor(end*duration/s));


data = sin(2*pi*freq.*t);
Signal = [data Signal];

end

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

end
0
Tayyab Khan Shinwari On

This is the exact code what i wanted ViG can you please remove this tak tak sound it just a noise actually how to use envelope function to remove thid tak tak sound in music code is following.

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];
    for i=1:length(FrTm)
      x=FrTm(i,1);
      y=FrTm(i,2);
      F=M(x);
      time=0:1/Fs:y/18;
      sinewave=sin(2*pi*F*time);
      signal=[signal sinewave];
     end
     stem(signal)
     sound(signal,Fs)