Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Matlab绘制FFT幅度谱信号_Matlab_Fft - Fatal编程技术网

用Matlab绘制FFT幅度谱信号

用Matlab绘制FFT幅度谱信号,matlab,fft,Matlab,Fft,我很难用分贝和赫兹来绘制正确的FFT幅度谱信号 首先,我只是以Hz和幅值绘制FFT频谱信号,如下所示: figure; X_mags = abs(fft(signal)); bin_vals = [0 : N-1]; freq_ax_bins = bin_vals*fs/N; N_2 = ceil(N/2); plot(freq_ax_bins(1:N_2), X_mags(1:N_2)); title('FFT Spectrum signal 1'); xlabel('Frequency (H

我很难用分贝和赫兹来绘制正确的FFT幅度谱信号

首先,我只是以Hz和幅值绘制FFT频谱信号,如下所示:

figure;
X_mags = abs(fft(signal));
bin_vals = [0 : N-1];
freq_ax_bins = bin_vals*fs/N;
N_2 = ceil(N/2);
plot(freq_ax_bins(1:N_2), X_mags(1:N_2));
title('FFT Spectrum signal 1');
xlabel('Frequency (Hz)')
ylabel('Magnitude');
这将导致预期图的震级始终大于0。最后,我只想做同样的事情,但以分贝为单位:

bin_vals = [0 : N-1];
freq_ax_Hz = bin_vals*fs/N;
N_2 = ceil(N/2);
figure;
plot(freq_ax_Hz(1:N_2), 10*log10(X_mags(1:N_2)));
xlabel('Frequency (Hz)')
ylabel('Amplitude (dB)');

看起来不错,但绘图部分被绘制成负dB。有人能告诉我如何正确绘制分贝的频谱吗?

对于您的第一个绘图,我注意到您只绘制了信号的前半部分。另一种可能更简单的方法是使用
fftshift

>> Xmag = fftshift(abs(fft(x)));
现在DC值处于中间,而不是开始。频率向量是
(-N/2:N/2-1)*fs/N

如果你的信号不是对称的,那么你需要看看负值

对于第二种情况,请注意dB需要
20*log10
,除非取
Xmag
的平方。没什么大不了的,只是一个标量,但我想你会想知道的

此外,定义并期望负dB。未为实数定义
log(-1)
,但
log(.1)
或任何小于1的其他数字返回否定答案

希望这有帮助