Генерация гистограммы по гармоническому числу - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь создать программу в GNU Octave для рисования гистограммы, показывающей основные и гармонические характеристики модифицированной синусоидальной волны (выходной сигнал из диммера SCR, который состоит из синусоидальной волны, которая находится в нуле до части пути сквозь волну).

Мне удалось сгенерировать форму волны и выполнить БПФ, чтобы получить набор точек Частота против амплитуды, однако я не уверен, как преобразовать эти данные в ячейки, подходящие для генерации гистограммы.

Пример кода и изображение того, что мне нужно ниже - спасибо за помощь!Harmonic number image

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");

1 Ответ

0 голосов
/ 01 июня 2018

Вы знаете свою базовую частоту (основной тон), назовем ее F.2*F - вторая гармоника, 3*F - третья и т. Д. Вы хотите установить ребра гистограммы наполовину между ними: 1.5*F, 2.5*F и т. Д.

У вас есть два периода на входесигнал, поэтому ваша (целочисленная) базовая частота равна k=2 (значение fft_vals[k+1], первый пик на вашем графике).Вторая гармоника находится на k=4, третья на k=6 и т. Д.

Таким образом, вы должны установить ребра бинов на k = 1:2:end.

В общем, это будет k = nCycles/2:nCycles:end.

Вы можете вычислить свою гистограмму в соответствии с нашими вычисленными ребрами бина следующим образом:

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);
...