www.gusucode.com > signal 案例源码程序 matlab代码 > signal/AmplitudeEstimationAndZeroPaddingExample.m
%% Amplitude Estimation and Zero Padding % This example shows how to use zero padding to obtain an accurate estimate % of the amplitude of a sinusoidal signal. Frequencies in the discrete % Fourier transform (DFT) are spaced at intervals of $F_s/N$, where $F_s$ % is the sample rate and $N$ is the length of the input time series. % Attempting to estimate the amplitude of a sinusoid with a frequency that % does not correspond to a DFT _bin_ can result in an inaccurate estimate. % Zero padding the data before computing the DFT often helps to improve the % accuracy of amplitude estimates. %% % Create a signal consisting of two sine waves. The two sine waves have % frequencies of 100 and 202.5 Hz. The sample rate is 1000 Hz and % the signal is 1000 samples in length. Fs = 1e3; t = 0:0.001:1-0.001; x = cos(2*pi*100*t)+sin(2*pi*202.5*t); %% % Obtain the DFT of the signal. The DFT bins are spaced at 1 Hz. % Accordingly, the 100 Hz sine wave corresponds to a DFT bin, but the % 202.5 Hz sine wave does not. % % Because the signal is real-valued, use only the positive frequencies from % the DFT to estimate the amplitude. Scale the DFT by the length of the % input signal and multiply all frequencies except 0 and the Nyquist by 2. % % Plot the result with the known amplitudes for comparison. xdft = fft(x); xdft = xdft(1:length(x)/2+1); xdft = xdft/length(x); xdft(2:end-1) = 2*xdft(2:end-1); freq = 0:Fs/length(x):Fs/2; plot(freq,abs(xdft)) hold on plot(freq,ones(length(x)/2+1,1),'LineWidth',2) xlabel('Hz') ylabel('Amplitude') hold off %% % The amplitude estimate at 100 Hz is accurate because that frequency % corresponds to a DFT bin. However, the amplitude estimate at 202.5 Hz is % not accurate because that frequency does not correspond to a DFT bin. % % You can interpolate the DFT by zero padding. Zero padding enables you to % obtain more accurate amplitude estimates of resolvable signal components. % On the other hand, zero padding does not improve the spectral (frequency) % resolution of the DFT. The resolution is determined by the number of % samples and the sample rate. % % Pad the DFT out to length 2000. With this length, the spacing between DFT % bins is $F_s/2000=0.5\;\rm Hz$. In this case, the energy from the 202.5 % Hz sine wave falls directly in a DFT bin. Obtain the DFT and plot the % amplitude estimates. Use zero padding out to 2000 samples. xdft = fft(x,2000); xdft = xdft(1:length(xdft)/2+1); xdft = xdft/length(x); xdft(2:end-1) = 2*xdft(2:end-1); freq = 0:Fs/(2*length(x)):Fs/2; plot(freq,abs(xdft)) hold on plot(freq,ones(2*length(x)/2+1,1),'LineWidth',2) xlabel('Hz') ylabel('Amplitude') hold off %% % The use of zero padding enables you to estimate the amplitudes of both % frequencies correctly.