Hi, I am new to root and having problems with FFT. I want to perform the FFT on captured time domain signals captured in the lab.
I have for example a 4 MHz square wave with 37,500 sample points. The code I am using is below. I would really appreciate if someone with more experience could help me answer these questions.
Should I use the same amount of time-domain points for the FFT?
On my output FFT graph , I am getting negative amplitudes? How is that possible if I am only getting the real values. Should I convert all values to absolute values and If so How do I do this?
The biggest issue is getting the graph to label the actual correct frequencies on the x-axis. How is this implemented? For example a 2KHz square wave FFT shows the fundamental peak at less than 100 on the x-axis and when I zoom in even this value changes. It is very important that I have correct frequency values labelled there.
My code is below. y is the Double_t array containing my time-domain data. I am not sure If I am going about it the correct way. Many thanks for any help in advance.
Int_t N = 37500; // number of points TVirtualFFT *fft = TVirtualFFT::FFT(1, &N, "R2C"); fft->SetPoints(y); fft->Transform(); TH1 *hb1 = 0; hb1 = TH1::TransformHisto(fft,hb1,"RE"); // fill histogram hb1 with real values TGraph* fftgraph = new TGraph(hb1); fftgraph->GetXaxis()->SetRange(0, N/2); // Don't displayed mirrored values std::string fftgraphName = (*it)+" FFT"; fftgraph->SetLineColor(2); fftgraph->SetTitle( fftgraphName.c_str() ); fftgraph->SetName( fftgraphName.c_str() ); fftgraph->Write();