0

假设我已经成功生成了一个单面功率谱,如下所示:

X_mags = abs(fft(signal));
bin_vals = [0 : N-1];
fax_Hz = bin_vals*fs/N;
N_2 = ceil(N/2);
plot(fax_Hz(1:N_2), 20*log10(X_mags(1:N_2)));`

现在我想在第一个图之上绘制第二个图:

hold on;

最后,我对信号进行 LPC 分析并计算频率响应。频率响应应绘制在功率谱的顶部,因此:

[a, g] = lpc(signal,N);
[h,f] = freqz(b,a,N,fs);
plot(?);

为了简单起见,假设所有参数都正确给出,我应该如何编写绘图函数才能正确显示频率响应?一个简单的 plot(f) 不起作用。

有人可以解释为什么吗?谢谢

4

2 回答 2

0

响应h很复杂,因此您需要通过乘以它的复共轭来获得响应的大小。:

plot(f, 10*log10(h.*conj(h)));

请注意 10*log10 的使用,因为上面的运算将 中保存的幅度响应平方h

或者,如果您对处理复数不太感兴趣,您可以只取复数的绝对值,确保为 20*log10,因为abs不会平方值

plot(f, 20*log10(abs(h)));
于 2014-12-13T14:30:11.390 回答
0

一个简单的plot(f)尝试绘制频率向量,不是吗?

检查下面的代码:

X_mags   = abs(fft(signal));
bin_vals = [0 : N-1];
fax_Hz   = bin_vals*fs/N;
N_2      = ceil(N/2);

[a, g]   = lpc(signal,N);
[h, f]   = freqz(b, a, N, fs);

figure,

hold on,
plot(f, 20*log10(abs(h)), 'r');
plot(fax_Hz(1:N_2), 20*log10(X_mags(1:N_2)));
title('Frequency Spectrum');
xlabel('Frequency (Hz)'); 
ylabel('Amplitude (dB)');
legend('Frequency Response', 'Single-sided Power spectrum')

顺便说一句,有一个db()用于分贝计算的 MATLAB 函数。那可能有用。

于 2014-12-13T14:31:11.167 回答