【问题标题】:What's wrong with my code in Matlab?我在 Matlab 中的代码有什么问题?
【发布时间】:2018-01-26 03:34:46
【问题描述】:

我想播放矩阵(FrTm)中给定的所有频率及其持续时间。实际持续时间为一秒,但每个频率必须播放 1/18 秒的 3 秒和 1/18 秒的 6 秒,例如矩阵( FTM)。

 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

【问题讨论】:

  • 我真的不明白你要做什么。 FrTm 是一个 59x2 矩阵,第一列是频率,第二列告诉你玩它时它应该是 3/18 秒还是 6/18 秒?但是你说总持续时间是1秒?您能否详细说明您想要实现的目标?此外,有时signal 有一个大写字母,有时没有,假设你想要signal 的1 个大向量,它应该是signal=[data signal]
  • ViG 首先感谢您的评论。好的,假设任何持续时间,但必须播放一些频率,提到持续时间的 3/18 和 FrTm 矩阵中给出的一些 6/18。抱歉信号以大写开头现在让我们帮我看看你能做些什么来产生吉他声音。这就是我到目前为止所做的。
  • 好的,我更改了程序。新代码只创建图不播放,为什么? t=0:1/18:5;对于 i=1:长度(FrTm),M(i)=FrTm(i,1); Z=M(i);数据= sin(2*piZ/Fst);信号=[数据;信号];端茎(信号);声音(信号,44100);结束
  • 我仍然不确定总长度的 3/18 是什么意思,因为你首先想要 50 Hz 播放总长度的 3/18,然后再一次,然后 52 Hz 播放 3 /18,然后是 54 和 50 和 54,然后你有 18/18。那么所有其他人的情况如何呢? FrTm 的第 2 列的总和是 192,这意味着您将有 192/18 倍于您想要的长度?我知道有些东西遵守总持续时间,但每个频率播放总持续时间的 3/192 或 6/192。可能你听不到的原因是因为幅度小
  • 好的,请进行一些更改,以便我可以听到这些频率的吉他和弦。

标签: matlab signals guitar


【解决方案1】:

在给定频率 (f) 和采样频率 (Fs) 下发出声音的经典方法是使用步长 1/Fs 制作时间向量:

time = 0:1/Fs:D;

其中D是信号的持续时间。那么信号本身就是:

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

在这种情况下,总时间是固定的,而不是每个信号的时间。总时间用T表示,总时间向量为

time = 0:1/Fs:T;

第二列的总和是向量time需要划分的总单位数,例如50, 3 表示需要播放 3 个单位的 50 Hz 信号。这意味着我们只需要一个长度为 3 个单位的时间向量:

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

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

【讨论】:

  • 你能解释一下你写的下面的代码吗? s = sum(FrTm(:,2));时间 = 0:1/Fs:T; [m, ~] = 大小(FrTm);信号 = []; A = 零(1,m);对于 i=1:m 频率 = FrTm(i,1);持续时间 = FrTm(i,2); t = time(1:floor(end*duration/192));
  • 声音太难听了,但非常感谢你,至少我听到了。最后一个要求,你能不能让它有点愉快
  • 好吧,忘记我发布的所有你刚刚为循环部分完成的代码
  • @TayyabKhanShinwari 我已经添加了一些解释。如果有什么不清楚的地方,现在让我说。这是不愉快的,因为这两种频率,也许是10*freq,这会让它变得更好。在这种情况下,您可以省略正弦前面的10*。或者因为总时长太短,那么就为T选择一个较大的值。
  • 非常感谢你,如果我能听到我听说过这段代码的可能声音,我会做一些实验。如果你解决了我的下面的代码,请告诉我一件事,我将非常感谢。
【解决方案2】:
 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

【讨论】:

    【解决方案3】:

    这是我想要的确切代码 ViG 你能删除这个 tak tak 声音吗它只是一个噪音实际上如何使用包络函数来删除音乐代码中的 thid tak tak 声音如下。

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-27
      • 2011-02-28
      • 1970-01-01
      • 2011-07-28
      相关资源
      最近更新 更多