# DC estimator algorithms

I wanted to remove the dc component from a signal but i can't use the average method because i have only a half cycle sampled not a full cycle . Is there any algorithm or method that can remove the dc component using only a half cycle?
(The signal is sin(x)+2*sin (2x) +3*cos (3x)+4*cos (4x) +5 =f (x), of course normally i dont have the function i have points (x,f (x)) .)

anorlunda
Staff Emeritus
It depends on how you define the DC component for one half cycle. Subtracting the average works for any signal sample according to my definition of DC offset.

It depends on how you define the DC component for one half cycle. Subtracting the average works for any signal sample according to my definition of DC offset.
Yes it would work but i can't because i dont have the full cycle so i cant get its average

berkeman
Mentor
Why do you only have a half-cycle? Is your memory not deep enough for a full cycle? And you have a half cycle of which frequency component? x or 4x? What is the signal to noise ratio (SNR) for your data acquisition?

Baluncore
Is there any algorithm or method that can remove the dc component using only a half cycle?
Take the fourier transform, FFT, of the signal. Overwrite the Cosine( zero ) component with zero. Take the IFT. The DC is gone!
Or; write a digital high-pass filter to eliminate the low frequencies.

Why do you only have a half-cycle? Is your memory not deep enough for a full cycle? And you have a half cycle of which frequency component? x or 4x? What is the signal to noise ratio (SNR) for your data acquisition?
Sorry for the late reply, i am asking for a friend so i had to get back to him, he said " he has a half cycle of the function not just the x or the 4x , he cant get a full cycle because the period is very long he doesnt have time to get a full cycle ( it's some kind of mechanical application, vibration or something, didnt really understand because i am electrical major :) )
As for the snr he's trying to figure it out right now as an ideal situation, once he figures it out he will start dealing with the noise from the sensors and the adc etc..

berkeman
Mentor
The signal is sin(x)+2*sin (2x) +3*cos (3x)+4*cos (4x) +5 =f (x),
I meant the frequencies of the sin() and cos() parts of the function. The periods are different when the arguments are x, 2x, 3x, 4x. Presumably he means only a half-cycle of the slowest-varying argument to the functions, which would be just x.

I'll try plotting that with Excel or Wolfram Alpha when I get a chance to see what it looks like...

• K Murty
Take the fourier transform, FFT, of the signal. Overwrite the Cosine( zero ) component with zero. Take the IFT. The DC is gone!
Or; write a digital high-pass filter to eliminate the low frequencies.
Doesnt fft require an integer number of cycles sampled?
As for the filters, he tried on matlab to multiply by this transfer function ( (1-z)/(1-0.95z)) he read somewhere online that this T.F blocks dc , then he set the simulation to end after half the period and it didnt work.

What he basically wants to do is get the graph of the integral of the function where C=0
But when he used numerical integration methods (because he doesnt have the function he has points) he got the right graph but there is a dc offset , he wants to remove it to get the right graph

Baluncore
Doesnt fft require an integer number of cycles sampled?
Not necessarily. Apply a raised cosine window function before the transform to reduce the sensitivity. If he has exactly one half cycle of the fundamental, there are ways to extend the data by adding samples with value zero, or by duplication, inversion or folding.

If he fits an order n-1 polynomial to n data points, then convert the coefficients to the integral, he will still have to eliminate the DC.

The constant 5 in the generator equation and the constant of integration will be combined. It will be impossible to separate the estimates of the integral of the constant +5 term and the constant of integration. I guess the problem depends on how the “DC offset” is defined. If he can see a DC offset, why can he not remove it?

Not necessarily. Apply a raised cosine window function before the transform to reduce the sensitivity. If he has exactly one half cycle of the fundamental, there are ways to extend the data by adding samples with value zero, or by duplication, inversion or folding.

If he fits an order n-1 polynomial to n data points, then convert the coefficients to the integral, he will still have to eliminate the DC.

The constant 5 in the generator equation and the constant of integration will be combined. It will be impossible to separate the estimates of the integral of the constant +5 term and the constant of integration. I guess the problem depends on how the “DC offset” is defined. If he can see a DC offset, why can he not remove it?
i didnt really understand what you said about the polynomilas, can you explain more please, if you dont mind.
about duplication ... he cant do that because there is no half wave symmetry ( the real function is actually longer than what i wrote , i just tried to give a simplified example) about
i dont understand how it will help, can you please explain further?

Baluncore
i didnt really understand what you said about the polynomilas, can you explain more please, if you dont mind.
Do you remember the quick way to differentiate a polynomial?
Say you have a polynomial y = a + bx + cx^2 + dx^3 + …
You know the derivative will be y' = b + 2cx + 3dx^2 + …
Reversing that process, you can generate the integral of the polynomial; y = a + bx + cx^2 + dx^3 + …
as; Integral( y ) = k + ax + (bx/2)^2 + (cx/3)^3 + (dx/4)^4 + … ; where k is the constant of integration.
You just need to be able to convert the n sample points to n-1 polynomial coefficients.

If I remember correctly, the same sort of trick can be done with fourier coefficients after an FFT.
Swap the Cos() and Sin() coefficients, negate as needed.

i dont understand how it will help, can you please explain further?
If you have less than 2^n points you can follow it with zeros to make it up to 2^n points for a FFT.
If you have exactly half a cycle of fundamental, repeating the data, but negative, will complete the fundamental cycle. It may cancel or double the other coefficients.

• abdo799
If you have exactly half a cycle of fundamental, repeating the data, but negative, will complete the fundamental cycle. It may cancel or double the other coefficients.
So for example if i have a signal with period 6 s and i am taking a sample every 1 s
Lets say
0 1
1 3
2 4
3 2
If i assumed that
4 -3
5 -4
6 -2
The fundemetal component should be the same but other coefficient will be changed?

Baluncore
That looks OK, except for the confusing entry; 0 1.

• abdo799
That looks OK, except for the confusing entry; 0 1.
I got confused too when i was typing the reply , i will tell him to try it.
Will parameter estimators ( like maximum likelyhood for example ) work?

Baluncore
I got confused too when i was typing the reply , i will tell him to try it.

Will parameter estimators ( like maximum likelyhood for example ) work?
I have no idea. Every method leads to the correct result, only the error bars are different. If you know what you are looking for in the data you will find it, but is it really there, or is it just some lucky noise.

Working through an intermediary or translator can lead to misunderstandings. The incomplete example equation given is not what I would expect in the real world. In the situation where the fundamental is smaller than the harmonics, I would expect stored energy, instability or a chaotic surprise.

All we can do here is throw in suggestions of different possible approaches. Education involves understanding possible solutions well enough, to reject them for valid reasons.

If you are using fourier coefficients then maybe the problem is cyclic. Make the number of samples per cycle a count of 2^n so as to benefit from the FFT. Use many samples for the highest frequency present, not the requisite Nyquist 2, but an absolute minimum of 16. That way, resolution will be sufficient to keep the expected harmonics separate while still using a window function.

Last edited: