【问题标题】:How to use envelope function in MatlabMatlab中如何使用包络函数
【发布时间】:2018-01-29 11:48:27
【问题描述】:

下面的 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)

【问题讨论】:

    标签: matlab audio signal-processing guitar


    【解决方案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)
      

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

    【讨论】:

    • 请不要忘记投票并选择此解决方案作为回答问题。
    • 非常感谢第二个解决方案更接近了。所以如果我简单地乘以 2*sin(2*piFtime) 或添加 Pi+sin(2*pi F时间)?实际上应用这两个完全消除 tak tak 或噪音。顺便说一句,非常感谢你,我认为这是低频的问题。
    • 你说得对,实际上我读到的声音应该最好采用整数。不要乘以你的信号,而只是在最后运行:sound(round((2^8)*signal),Fs,8)。您将拥有一个没有 tak-tak 的 gameboy 8 位声音。
    • 我听不到任何声音。它在第 1 列显示错误
    • 它对我有用。如果您只是使用我的最后一个脚本并仅替换它起作用的声音功能。你的 Matlab 版本是多少?
    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 2014-04-20
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2015-12-08
    相关资源
    最近更新 更多