Simulink Matlab Fcn, logical error for incrementation in Goertzel's algorithm

15 ビュー (過去 30 日間)
bieron surya
bieron surya 2025 年 6 月 18 日
コメント済み: bieron surya 2025 年 6 月 18 日
I am trying to use the Simulink Fcn block to code out Goertzel's algorithm to implement digital fourier transform(DFT) in real time for my project. The target of the DFT is the grid current, i implemented the code below based on the abc coordinates. However, I found this error where the variable count should increment by time, upto 200 and then reset back to zero, but during the simulation count just remains as 1, what could be the problem?? shouldn't count=count+1; increment over time?
Additionally, if there is anybody familiar with Goertzel's algorithm, that would also help!
function [mag_a,mag_b,mag_c,count]= goertzel(Ia,Ib,Ic,h_freq)
%%Calculate magnitude of harmonic h (e.g., h=5 for 250Hz @ 50Hz grid)
%initialization------
s0_a=double(0);
s1_a=double(0);
s2_a=double(0);
s0_b=double(0);
s1_b=double(0);
s2_b=double(0);
s0_c=double(0);
s1_c=double(0);
s2_c=double(0);
real_a=double(0);
imag_a=double(0);
mag_a=double(0);
real_b=double(0);
imag_b=double(0);
mag_b=double(0);
real_c=double(0);
imag_c=double(0);
mag_c=double(0);
last_mag_a=double(0);
last_mag_b=double(0);
last_mag_c=double(0);
count=single(0);
bin=uint(0) ; %integer, k
k=uint(0);
%--------------------
fs=1000;
N=100;
k=0.5+(N*h_freq)/fs;
omega=(2*pi*k)/N;
%calculation of Goertzel Algorithm for abc coordinates
%to find magnitude in individual harmonic orders
s0_a = Ia + 2*cos(omega)*s1_a-s2_a;
s2_a = s1_a;
s1_a = s0_a;
s0_b = Ib + 2*cos(omega)*s1_b-s2_b;
s2_b = s1_b;
s1_b = s0_b;
s0_c = Ic + 2*cos(omega)*s1_c-s2_c;
s2_c = s1_c;
s1_c = s0_c;
count=count+1;
if count == N
real_a = s1_a-s2_a*cos(omega);
imag_a = s2_a*sin(omega);
last_mag_a = 2*sqrt(real_a*real_a+imag_a*imag_a)/N;
real_b = s1_b-s2_b*cos(omega);
imag_b = s2_b*sin(omega);
last_mag_b = 2*sqrt(real_b*real_b+imag_b*imag_b)/N;
real_c = s1_c-s2_c*cos(omega);
imag_c = s2_c*sin(omega);
last_mag_c = 2*sqrt(real_c*real_c+imag_c*imag_c)/N;
count=0;
s1_a=0;
s2_a=0;
s1_b=0;
s2_b=0;
s1_c=0;
s2_c=0;
end

採用された回答

Paul
Paul 2025 年 6 月 18 日
Hi bieron surya,
Every time the function executes it hits the line
count = single(0);
which does exactly what it says, i.e., sets the value of count to zero, and then it hits the line
count = count + 1
which increments the value of count to 1.
Note that a similar issue occurs, for example, with s1_a that is set to 0 and then used in the equation for Ia.
I'm not sure what the algorithm is trying to do, but it looks like the intent is to have several variables in the function retain their values from one step to the next. If so, check out how to use Persistent Variables.
  1 件のコメント
bieron surya
bieron surya 2025 年 6 月 18 日
yess thank you! using presistent variables actually work right now.

サインインしてコメントする。

その他の回答 (1 件)

Walter Roberson
Walter Roberson 2025 年 6 月 18 日
count=single(0);
That statement is executed every time the block is executed.
You need
persistent count
if isempty(count); count = single(0); end

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by