0

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

3 回答 3

0

以给定频率 (f) 和采样频率 (Fs) 发出声音的经典方法是使用 step 生成时间向量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);

于 2018-01-27T15:47:55.430 回答
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
于 2018-01-27T16:20:30.963 回答
0

这是我想要的确切代码 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)
于 2018-01-29T10:59:52.563 回答