This is My MATLAB code for Fourier Transform method (algorithm A in the paper "On computing the distribution function for the Poisson binomial distribution") and I do not know where the problem is:
function [result,p]=Poisson_binomial_Probability_density_function_FourierTeansform(k,success_probailities)
format long
n=length(success_probailities);
if any(success_probailities<0)|| any(success_probailities>1)
error('invalid values in success_probailities array!');
end
if k>length(success_probailities)
error('invalid value for k!! (0<=k<=length(success_probailities))');
end
a=zeros(1,m);
b=zeros(1,m);
for g=1:m
[a(g),b(g)]=x_real_imaginary(success_probailities,g);
a(n+1-g)=a(g);
b(n+1-g)=-b(g);
x(g)=a(g)+1i*b(g);
x(n+1-g)=a(n+1-g)+1i*b(n+1-g);
end
x=[1,x];
p=fft(x/(n+1));
result=p(k+1);
end
function [result]=abs_z(p,l,n)
%p is the success probability
w=(2*pi)/(n+1);
r1=(1-p+(p*cos(l*w)))^2;
r2=(p*sin(l*w))^2;
result=sqrt(r1+r2);
end
function [result]=Arg_z(p,l,n)
%p is the success probability
r1=1-p+(p*cos(l*(2*pi)/(n+1)));
r2=p*sin(l*(2*pi)/(n+1));
result=atan22(r2,r1);
end
function [result]=atan22(y,x)
if x>0
result=atan(y/x);
elseif y>=0 && x<0
result=atan(y/x)+pi;
elseif y<0 && x<0
result=atan(y/x)-pi;
elseif y>0 && x==0
result=pi/2;
elseif y<0 && x==0
result=-pi/2;
elseif y==0 && x==0
result=0;
end
end
function [result]=d(success_probailities,l)
sum=0;
n=length(success_probailities);
for i=1:n
sum=sum+log(abs_z(success_probailities(i),l,n));
end
result=exp(sum);
end
function [a,b]=x_real_imaginary(success_probailities,l)
r=0;
n=length(success_probailities);
for i=1:n
r=r+Arg_z(success_probailities(i),l,n);
end
dl=d(success_probailities,l);
a=dl*cos(r);
b=dl*sin(r);
end