Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于MATLAB的谐波乘积谱_Matlab - Fatal编程技术网

基于MATLAB的谐波乘积谱

基于MATLAB的谐波乘积谱,matlab,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_ff

我想用谐波积谱求音符的基频。这是实现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时,我会得到以下图表:

上图分别显示了seg_fft2、seg_fft3、seg_fft4和seg_fft5的曲线图

但我不明白的是,为什么在这些图中获得的频率点不是原始频谱的因子??HPS不就是这样工作的吗

这是我得到的图,当我得到所有5个的乘积时

峰值为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提前