【问题标题】:Generating a Histogram by Harmonic Number通过谐波数生成直方图
【发布时间】:2018-05-31 21:38:28
【问题描述】:

我正在尝试在 GNU Octave 中创建一个程序来绘制一个直方图,显示修改后的正弦波的基波和谐波(来自 SCR 调光器的输出,它由一个正弦波组成,该正弦波在波的中途处为零) .

我已经能够生成波形并执行 FFT 以获得一组频率与幅度的点,但是我不确定如何将此数据转换为适合生成直方图的 bin。

下面的示例代码和我所追求的图像 - 感谢您的帮助!

clear();
vrms = 120;
freq = 60;
nCycles = 2;
level = 25;
vpeak = sqrt(2) * vrms;
sampleinterval = 0.00001;
num_harmonics = 10

disp("Start");

% Draw the waveform
x = 0 : sampleinterval : nCycles * 1 / freq; % time in sampleinterval increments
dimmed_wave = [];
undimmed_wave = [];
for i = 1 : columns(x)
  rad_value = x(i) * 2 * pi * freq;
  off_time =  mod(rad_value,  pi);
  on_time =  pi*(100-level)/100;
  if (off_time < on_time)
    dimmed_wave = [dimmed_wave, 0]; % in the dimmed period, value is zero
  else
    dimmed_wave = [dimmed_wave, sin(rad_value)]; % when not dimmed, value = sine
  endif
  undimmed_wave = [undimmed_wave, sin(rad_value)];
endfor

y = dimmed_wave * vpeak; % calculate instantaneous voltage
undimmed = undimmed_wave * vpeak;

subplot(2,1,1)
plot(x*1000, y, '-', x*1000, undimmed, '--');
xlabel ("Time (ms)");
ylabel ("Voltage");

% Fourier Transform to determine harmonics
subplot(2,1,2)

N = length(dimmed_wave);  % number of points
fft_vals = abs(fftshift(fft(dimmed_wave))); % perform fft
frequency = [ -(ceil((N-1)/2):-1:1) ,0 ,(1:floor((N-1)/2)) ] *  1 / (N *sampleinterval);
plot(frequency, fft_vals);
axis([0,400]);
xlabel ("Frequency");
ylabel ("Amplitude");

【问题讨论】:

    标签: signal-processing octave


    【解决方案1】:

    您知道您的基本频率(基音),我们称之为F2*F 是二次谐波,3*F 是三次谐波,等等。您想在这些之间设置直方图 bin 边缘:1.5*F2.5*F 等。

    您的输入信号中有两个周期,因此您的(整数)基频为 k=2fft_vals[k+1] 处的值,图中的第一个峰值)。二次谐波在k=4,三次谐波在k=6,以此类推。

    所以你可以将你的垃圾箱边缘设置为k = 1:2:end

    一般来说,这将是k = nCycles/2:nCycles:end

    您可以根据我们计算的 bin 边缘计算您的条形图,如下所示:

    fft_vals = abs(fft(dimmed_wave));
    nHarmonics = 9;
    edges = nCycles/2 + (0:nHarmonics)*nCycles;
    H = cumsum(fft_vals);
    H = diff(H(edges));
    bar(1:nHarmonics,H);
    

    【讨论】:

    • 嗯。我知道我的 bin 边缘应该是 1.5*F(在这种情况下是 60Hz,所以我的二次谐波 bin 以 2*60=120Hz 为中心,并且 bin 来自 120-150Hz,依此类推) - 但是:我的输出值FFT 是 x,y 坐标,其中 X 是频率,Y 是幅度。我如何将它们划分为 bin 并保留幅度数据? (对不起,我的数学非常生疏,所以我可能解释得不好)..
    • @docsteer:您不必担心以赫兹为单位的频率计算。使用“整数频率”k 要容易得多。查看编辑后的问题(我没有运行代码,我的这台电脑上没有 Octave,如果有任何拼写错误,请告诉我)。
    • 谢谢 - 所以我试了一下,它确实运行了,但并没有达到我的预期。图片here - 查看 FFT 的输出,我在 60Hz(基波)、180Hz(3 次谐波)、300Hz(5 次谐波)等处有峰值。这不会反映在生成的直方图中。
    • @docsteer:你说得对,histc 毫无意义,抱歉。我已经用不同的代码替换了它,这些代码确实产生了正确的结果。
    • 稍作调整,就做到了!我需要丢弃 FFT 输出的负频率分量——一旦完成,我得到了正确的结果。最终代码是here 和图像here,以防将来对某人有用。感谢@Cris-Luengo 的帮助!
    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 1970-01-01
    • 2012-08-14
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多