필터 지우기
필터 지우기

Why are the peaks of my spectrum not exactly at the frequencies of my sinusoidal input signal?

조회 수: 6 (최근 30일)
I consider an input signal, which is the superposition of 2 sine-waves of different frequencies and phases, but the same amplitude. I want to create the spectrum of it. Since the 2 frequencies are 11 GHz and 11.5 GHz, I expect the peaks of my spectrum to be at exactly these 2 frequencies. However when I plot the spectrum, one peak is at 1.101e+10 and the other is at 1.151e+10 Hz. I am new to fft so I don't understand what I have done wrong. Do you think a window-function might help? I'd take the time to read about it then.
T = 100e-9; % acquisition
f_s = 1e12; % sampling rate
t = transpose(0 : 1/f_s : T-1/f_s); % samples, size = 10000
f_c = 11.5e9; % specify carrier frequency in Hz
% we consider the sum of 2 input signals
f_1 = -0.5e9;
f_2 = 0;
f = [f_1 f_2]';
% specify phase in degree
theta_1_deg = 0;
theta_2_deg = 0;
theta_1 = degtorad(theta_1_deg);
theta_2 = degtorad(theta_2_deg);
theta = [theta_1 theta_2]';
A single sine-wave looks like this:
x_sine(:,i) = A_in*sin(2*pi*(f_c+f(i))*t + theta(i));
I generate it for f1 and f2 and then I add it and perform a one-sided fft.

채택된 답변

David Goodmanson
David Goodmanson 2016년 12월 27일
Hi Luc, I don't believe that the fft or ifft is necessarily inaccurate just because it is discrete or has finite boundaries. Your time grid is correct, but I think you just have an off-by-one problem with the frequency grid, which for an fft should start at f = 0. If you run the code below you will find the two peaks exactly where you think they should be.
T = 100e-9; % acquisition
f_s = 1e12; % sampling rate
t = transpose(0 : 1/f_s : T-1/f_s); % samples, size = 10000
% construct frequency grid
N = length(t);
delf = f_s/N;
f = (0:N-1)*delf;
f_c = 11.5e9; % specify carrier frequency in Hz
% we consider the sum of 2 input signals
f_1 = -0.5e9;
f_2 = 0;
x = sin(2*pi*(f_c + f_1)*t) + sin(2*pi*(f_c + f_2)*t);
z = fft(x);
plot(f,abs(z))
xlim([1e10 1.2e10])
  댓글 수: 2
Luki
Luki 2016년 12월 27일
편집: Luki 2016년 12월 27일
ok, thx very much! Can you explain why your code works:
N = length(t);
delf = f_s/N;
f = (0:N-1)*delf;
and this does not:
f_negative = linspace(-f_s/2,f_s/2,length(x));
f_positive = f1(end/2+1:end);
Am I not addressing frequency 0 ? I would plot x vs f_positive
David Goodmanson
David Goodmanson 2016년 12월 27일
The issue is that fft(x) always puts zero frequency at the first point in the array. If you had used
z = fftshift(fft(z))
then the point in z corresponding to f = 0 is in the middle of the array. I will discuss only N even here, so f = 0 is at point N/2+1. If you were going to make a plot or something, you could make the appropriate frequency grid for that,
(-N/2:N/2-1)*delf.
Then pull off the upper half of that array for positive frequencies. However, without using fftshift the positive frequency points are always in the lower half of the array. To get positive frequencies I think it's easier to just do
z(1:N/2) % values
(0:N/2-1)*delf % freqs
f(1:N/2) % freqs if you already have the right f grid
Note the off-by-one situation between z and f. f=0 has to be at point 1 since Matlab is one-based.
There is a slight change in the details for N odd.

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

John D'Errico
John D'Errico 2016년 12월 26일
Is a fast Fourier transform, based on a finitely sampled signal, identical to a true Fourier transform, based on integration of functions? (Hint: No.)
A FFT is an approximation, based on a finitely sampled signal. Just as a trapezoidal rule for integration is not exactly correct for almost all smooth functions, this is also true for the FFT.
On the other hand, an FFT is a hell of a lot easier and faster to compute.
Did your result actually come pretty close to what you expected? (Yes.) So why do you think you have a problem? (I don't know.)

Image Analyst
Image Analyst 2016년 12월 26일
편집: Image Analyst 2016년 12월 26일
See my attached demo.
Note that there are two frequencies added together and you do get the 4 spikes as expected. But see there is still some energy near the bottom of the spikes. This is due to cropping the signal. As you know the transform of a rect (your cropping function) is a sinc function so the spikes are convolved with a sinc. Recall that multiplication by a rect in the time domain is convolution of the two spectra, in other words convolution of delta functions (FT of sine waves) with sincs (FT of rect).

카테고리

Help CenterFile Exchange에서 Fourier Analysis and Filtering에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by