我在Matlab中的代码出了什么问题?

时间:2018-01-26 03:34:46

标签: matlab signals guitar

我想播放矩阵(FrTm)中给出的所有频率及其持续时间。实际持续时间为1秒,但每个频率必须播放1/18中的3和1/18 seocnd中的6,如矩阵中给出的( 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 个答案:

答案 0 :(得分:0)

使用给定频率(f)和采样频率(Fs)发出声音的经典方法是使用步骤time = 0:1/Fs:D; 制作时间向量:

D

其中signal = sin(2*pi*f.*time) 是信号的持续时间。信号本身就是:

T

在这种情况下,总时间是固定的,而不是每个信号的时间。总时间用time = 0:1/Fs:T; 表示,总时间向量用

表示
time

第二列的总和是向量50, 3需要划分的单位总数,例如t = time(1:floor(end*duration/s)); 表示需要为3个单位播放50 Hz的信号。这意味着我们只需要一个长度为3个单位的时间向量:

duration

其中s是此部分的单位数,data = sin(2*pi*f*t); 是单位总数。如上所述,信号就是简单的

signal

然后将数据附加到整个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); 。完整的代码如下所示:

time

注意,不要在开头声明time = 0:1/Fs:T;,而是每次运行循环时都可以创建一个新的向量。在这种情况下,请省略t = time(1:floor(end*duration/s));并将t = 0:1/Fs:floor(end*duration/s);更改为horizontal

答案 1 :(得分:0)

 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

答案 2 :(得分:0)

这是我想要的确切代码ViG可以请你删除这个播放声音它只是一个噪音实际上如何使用信封功能删除音乐代码中的听到的声音跟随。

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)