使用MATLAB的谐波产品谱

时间:2013-11-18 15:13:16

标签: matlab

我想用谐波产品谱找到音符的基频。这是实现HPS算法的部分

seg_fft = seg_fft(1 : size(seg_fft,1)/2 );  % FFT data
    seg_fft = abs(seg_fft);

    seg_fft2 = ones(size(seg_fft));
    seg_fft3 = ones(size(seg_fft));
    seg_fft4 = ones(size(seg_fft));
    seg_fft5 = ones(size(seg_fft));

    for i = 1:floor((length(seg_fft)-1)/2)
        seg_fft2(i,1) = (seg_fft(2*i,1) + seg_fft((2*i)+1,1))/2;
    end

for i = 1:floor((length(seg_fft)-2)/3)
        seg_fft3(i,1) = (seg_fft(3*i,1) + seg_fft((3*i)+1,1) + seg_fft((3*i)+2,1))/3;    
    end

for i = 1:floor((length(seg_fft)-3)/4)
        seg_fft4(i,1) = (seg_fft(4*i,1) + seg_fft((4*i)+1,1) + seg_fft((4*i)+2,1) + seg_fft((4*i)+3,1))/4;
    end

 for i = 1:floor((length(seg_fft)-4)/5)
        seg_fft5(i,1) = (seg_fft(5*i,1) + seg_fft((5*i)+1,1) + seg_fft((5*i)+2,1) + seg_fft((5*i)+3,1) + seg_fft((5*i)+4,1))/5;
    end

f_ym = (seg_fft) .* (seg_fft2) .* (seg_fft3)  .* (seg_fft4) .*(seg_fft5);

现在当我玩F4时,二次谐波(698 -F5)具有更高的振幅。因此,HPS应该帮助我检测F4和非F5的基波。 当我做HPS这些是我得到的图表: Plot of seg_fft2 seg_fft3

seg_fft4

seg_fft5

上图分别显示了seg_fft2,seg_fft3,seg_fft4和seg_fft5的图。

但我不明白的是,为什么这些图中获得的频率点不是原始频谱的因素?是不是HPS应该如何工作?

这是我在拍摄所有5个产品时获得的情节。enter image description here

峰值是698Hz ..但不应该是349Hz而不是??

但是在整个代码运行之后,我确实得到了基本的F4 ..这一切都非常令人困惑....有人能告诉我为什么我的图表与预期不同但我得到了正确的基础吗? ??

这是代码的其余部分

    %HPS, PartIII: find max
     f_y1 = max(f_ym)

      for c = 1 : length(f_ym)
          if(f_ym(c,1) == f_y1)
              index = c;
          end
      end

      % Convert that to a frequency
      f_y(h) = (index / NFFT) * FS;

      h=h+1;

%end

V = abs(f_y);

请提前帮助...... Thanx ....

0 个答案:

没有答案
相关问题