最近需要用到 Matlab 仿真雷达成像 😀
对于一些函数的细节还是有挺多地方需要注意的 ☁️
首先,有问题可以之间参考 官方文档
1. FFT
需要理解以下几个问题:
Q:为什么需要使用 fftshift
Q:fft
返回的序列的每个分量分别代表什么频率(数字频率和物理频率的联系)
笔记贴图(不想打字) ▪️ ▫️ (对了,这个是官方给的例子) ▪️ ▫️
![](https://img-blog.csdnimg.cn/4b3abfce763f48879d6dce42ee71be8e.png)
![](https://img-blog.csdnimg.cn/90c979cd082b4d66a44ecc6c97f863c9.png)
![](https://img-blog.csdnimg.cn/1b123ecd1ec048f79fa09490bcb9db12.png)
问题答案(个人理解)
A:卷积具有周期性,平移后能够更直观的显示频谱
A:序列长度为 N N N,fft 输出序列长度也是 N N N,则 fft 的第 k 个分量对应的数字频率为 2 π N k \frac{2 \pi}{N} k N2πk,对应物理频率为 k N × F s \frac{k}{N} \times F_s Nk×Fs,因此 fft 的频率分辨率为 F s N \frac{F_s}{N} NFs,序列越长,频率分辨率越高,频谱越精细。
遗留问题
x2 = linspace(1, 3, 3);
fft(x2)
fft(x2, 6)
fft(x2, 6)
的输出是否等价于 fft(x2)
+ 插值
2. 卷积
2.1 时域计算卷积
卷积表达式:
g
(
n
)
=
x
(
n
)
∗
y
(
n
)
=
∑
n
=
−
∞
+
∞
x
(
m
)
×
y
(
n
−
m
)
g(n) = x(n)*y(n) = \sum_{n=-\infin}^{+\infin} {x(m)\times y(n-m)}
g(n)=x(n)∗y(n)=n=−∞∑+∞x(m)×y(n−m)
可以使用 conv
计算卷积:
clc
x1 = linspace(1, 4, 4);
x2 = linspace(1, 3, 3);
y1 = conv(x1, x2)
% 1 4 10 16 17 12
2.2 频域计算卷积
N = length(x1) + length(x2) - 1;
Nfft = 2^nextpow2(N);
y2 = ifft(fft(x1, Nfft).*fft(x2, Nfft))
% 1.0000 4.0000 10.0000 16.0000 17.0000 12.0000 0 -0.0000
两种方法输出一样,只是后者尾部多了零(原因还未弄清楚,学完 DSP 补上)
3. 频域相关运算
相关运算
r
x
y
(
m
)
=
∑
n
=
−
∞
+
∞
x
∗
(
n
)
×
y
(
n
+
m
)
r_{xy}(m) = \sum_{n=-\infin}^{+\infin} {x^*(n)\times y(n+m)}
rxy(m)=n=−∞∑+∞x∗(n)×y(n+m)
对序列做相关运算可以之间调用 xcorr
函数
x1 = linspace(1, 12, 12);
x2 = linspace(1, 8, 8);
y1 = xcorr(x1, x2)
也可以使用卷积计算互相关函数:
r x y ( m ) = x ∗ ( − m ) ∗ y ( m ) r_{xy}(m) = x^*(-m)*y(m) rxy(m)=x∗(−m)∗y(m)
也可以在频域做相关运算
r
x
y
(
m
)
=
f
−
1
(
f
(
x
1
)
×
f
∗
(
x
2
)
)
r_{xy}(m) =f^{-1}(f(x_1) \times f^{*}(x_2))
rxy(m)=f−1(f(x1)×f∗(x2))
matlab 程序
x1 = linspace(1, 12, 12);
x2 = linspace(1, 8, 8);
y1 = xcorr(x1, x2)
N = length(x1) + length(x2) - 1;
Nfft = 2^nextpow2(N);
cor = fftshift(ifft(fft(x1, Nfft).*conj(fft(x2, Nfft))));
range = Nfft/2+1 - (N-1)/2 : Nfft/2+1 + (N-1)/2;
y2 = cor(range)
注意,下面两种写法不等价:
cor_xy = fftshift(ifft(fft(X).*conj(fft(Y))))
cor_yx = fftshift(ifft(fft(Y).*conj(fft(X))))