-1

下面的 Matlab 代码会生成声音,但它包含类似 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*10*F*time);

      signal=[signal sinewave];

     end

     stem(signal)
     sound(signal,Fs)
4

1 回答 1

1

这里有两种可能的解决方案。它们并不完美,因为 tak-tak 仍然在这里,但它要低得多。

  1. 应用高通滤波器以消除似乎是低频的烦人声音

    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)/4;
        time=0:1/Fs:y/18;
        sinewave=sin(2*pi*10*F*time);
    
        signal=[signal sinewave];
    
    end
    
    % Creating high-pass filter with passband frequency of 1000 Hz (may be too high)
    hpFilt = designfilt('highpassiir','FilterOrder',8, ...
        'PassbandFrequency',1000,'PassbandRipple',0.2, ...
    'SampleRate',Fs);
    % Filtering sound
    signal = filter(hpFilt,signal);
    
    sound(signal,Fs)
    
  2. 从每个生成的正弦波中取最后一个值,并为下一个正弦波找到相应的相位,以使正弦波尽可能连续

     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];
     previous_end_val = 0;
     for i=1:length(FrTm)
         x=FrTm(i,1);
         y=FrTm(i,2);
         F=M(x)/4;
         time=0:1/Fs:y/18;
    
         % Calculating required phase to match the end of previous sinewave
         phi = asin(previous_end_val);
         % Generating sinewave with phase phi
         sinewave=sin(2*pi*10*F*time + phi);
         previous_end_val = sinewave(end);
    
         signal=[signal sinewave];
    
     end
    
     sound(signal,Fs)
    

第一个解决方案并不完美:如果您采用太高的通带频率,您就听不到最低的可听频率。第二种解决方案更快、更优雅。请问有没有不明白的方法。

于 2018-01-29T18:10:57.283 回答