我需要有关卷积的帮助。我正在尝试对一个信号进行卷积长,采样频率为. 我需要用一个矩形脉冲卷积它,它有脉冲宽度。当我尝试在 MATLAB 中使用 conv 函数时,我的电脑进入忙碌状态,它没有给我任何答案。有人可以帮我解决这个问题吗?
MATLAB中两个大信号的卷积
如果您的较短脉冲信号确实是矩形波形,那么请寻找其他答案,但对于一般波形脉冲,以下代码片段(摘自 Maximillian 的上一篇文章)显示了实际结果(在我的带有 MATLAB R2015 的笔记本电脑上)时间用最简单的术语表示卷积操作的频域与时域实现。
请注意,由于内存原因,我已将采样率Fs从 10 Ghz降低到 1 Ghz,并且我还稍微调整了序列长度以产生功率FFT 长度,以便 FFT 可以全速运行。(这对于实践课程来说有点不公平,但在这里我希望看到最大可达到的速度增益,因此为此目的使用低效的 FFT 长度是不合适的)
Fs = 10E8; % reduced for MEMORY reasons
T = 17e-3; % slightly adjusted
t = 0:1/Fs:T;
t = t(1:(2^24-2^14+1)); % its length is adjusted to create a 2^N factoring later.
y = sin(2*pi*1000*t); % The input signal
L1 = length(y);
w_rect = 17e-6; % width of rect
R = ones(1,Fs*w_rect);
R = pulse(1:2^14);
L2 = length(R);
tic
y2 = real(ifft(fft(y,L1+L2-1).*fft(R,L1+L2-1)));
tdft = toc
tic
y3 = conv(y,pulse);
tconv = toc
eff = tconv/tdft
结果如下:tdft = 1.4769 s,tconv = 42.14 s,因此速度增益 = eff = 28.5x。
另一方面,对于略有不同但在其他方面无法考虑的 FFT 长度,速度增益下降到 10 倍是可以理解的。
这正是您应该认真考虑在频域(使用高效 FFT)而不是时域实现卷积的情况!
触发条件的原因是较短的脉冲信号(大约 150k 样本)对于直接时域卷积来说已经太长了。
让我们对长度约为的信号的两种方法进行简要比较样品和样品:
在第一种情况下,直接时域实现大约需要许多真正的 MACS 是关于真正的 MAC。
现在将其与基于 FFT 的频域实现进行比较(根据时域中的卷积等于 DFT 的频域定理中的乘法)。再次使用粗略的数字,将分为三个步骤: 1- 将两个信号转换为相同(且足够长)长度的频域(实际上是) 使用高效 FFT,2 乘以获得的 DFT 并得到输出 DFT,3 使用逆 FFT 将结果转换回时域。
第一步需要大约真正的 MACS 是关于真正的 MAC
第二步大概需要真正的 MAC
最后,第三步将需要大约真正的 MAC。
因此,基于 FFT 的频域卷积实现的总体要求大致为:真正的 MAC。
现在将其与所需的时域实现进行比较真正的 MAC。假设基本实现,这可能会导致大约500 倍的速度提高。因此,例如,如果卷积在直接时域实现中需要5 个小时,那么在基于 DFT 的情况下应该需要大约36 秒!
所以你最好遵循第二种方法。话虽如此,现在可用的基于多核 CPU + GPU 的广泛矢量化(并行)实现可以显着减少卷积的直接时域计算时间,但是 FFT 的效率也将受益于这种并行化,因此你应该,尽管如此,使用 DFT 方法时,速度会提高一个数量级。
还请考虑这样的长序列可以按块处理,这也将解释内存和速度性能的某些改进。
编辑:我试图在基于非阻塞的模式下实现 DFT 处理,其中整个信号在内存中一次处理,但需要太多的 RAM(对于只有 8GB 的 PC 中的 MATLAB,大约至少 10 GB当前所有程序的RAM,因此它开始分页并进入冻结状态,(计算机只是stcuk甚至对ctrl + alt + del没有任何响应,所以我不得不硬重置它)如果您有更多内存,例如16 GB或更高您仍然可以尝试,它可能还可以,因为我认为它最多需要大约 10 GB 的 RAM(加上使用剩余 RAM 的任何其他程序)。但否则您应该考虑划分较大的信号(150 M 样本)切成小块或使用其他技术。
使用一般卷积,Fat32 是完全正确的。您应该尝试使用 Overlap-Add 或 Overlap-Save 算法在频域中执行卷积(另请参见此处)。实际上,我很惊讶 MATLAB 在卷积方面没有使用这些算法(我已经尝试过了,计算时间比使用 OLA/OLS 算法所期望的要长得多)。
但是,对于您的特殊问题,还有一个更简单的解决方案:与 rect 的卷积实际上是一个移动平均滤波器:
我们也可以这样写
和
是信号的累积和。
因此,您可以简单地实现卷积:
X = cumsum(x);
y = x;
y(N:end) = y(N:end) - X(1:end-N+1);
这比任何“快速卷积”都要快得多。