ifft 并使用方波之和而不是正弦波之和来重建信号

ifft and using a sum of square waves instead of the sum of sine waves to rebuild a signal

我知道 ifft 从对信号执行 fft 获得的数据中汇总多个正弦波。有没有办法用方波而不是正弦波来做iff​​t
我不是试图取回原始信号,而是尝试使用从 fft 获取的数据中的方波而不是正常的正弦波求和过程来重建它。

请参阅下面的简单示例:我将使用的信号是大约 60 秒长的人类音频信号,因此我正在尝试查看是否可以以某种方式使用/更改 ifft 命令。

PS:我正在使用类似于 Matlab 的 Octave 4.0

clear all,clf reset, clc,tic
Fs = 200; % Sampling frequency
t=linspace(0,1,Fs);
freq=2;

%1 create signal
ya = .5*sin(freq*pi*2*t+pi); 

%2 create frequency domain
ya_fft = fft(ya);

%3 rebuild signal
mag = abs(ya_fft);
phase = unwrap(angle(ya_fft));
ya_newifft=ifft(mag.*exp(i*phase));
ifft_sig_combined_L1=ifft(mag.*exp(i*phase),Fs); %use Fs to get correct file length

% square wave
vertoffset=0.5;
A=1
T = 1/freq; % period of the signal
square = mod(t * A / T, A) > A / 2;
square = square - vertoffset;

subplot(3,1,1);
plot(t,ya,'r')
title('orignal signal')

subplot(3,1,2);
plot(t,ifft_sig_combined_L1)
title('rebuilt signal')

subplot(3,1,3);
plot(t,square)
title('rebuilt signal with square wave')

定义您要使用的基向量,并让它们成为矩阵 A 的列。如果 b 是您的信号,则只需获得 Ax = b 的最小二乘解。如果 A 是满秩,那么你将能够准确地表示 b。

编辑:

想想矩阵-向量乘积的作用:矩阵的每一列乘以向量的相应元素(即矩阵的第 n^ 列乘以矩阵的第 n^ 个元素)矢量)和所得的产品加在一起。 (如果该站点支持乳胶,这将更容易说明。)在 Matlab 中,一种可怕但有希望说明的方法是

A = some_NxN_matrix;
x = some_Nx1_vector;
b = zeros( size(A,1), 1 );
for n = 1 : length(x)
  b = b + A(:,n) * x(n);
end

(当然,你永远不会真正做上面的事情,而是 b = A*x;。)

现在定义你想要使用的任何方波并将每个方波分配给它自己的 Nx1 向量。将这些向量称为 s_1、s_2、...、s_M,其中 M 是您使用的方波数。现在让

A = [s1, s2, ..., s_M];

根据您的问题,您希望将信号表示为这些方波的加权和。 (请注意,这正是 DFT 所做的,它只使用正交正弦波而不是方波。)要对这些方波进行加权和求和,您所要做的就是找到矩阵向量积 A*x,其中 x 是对每列加权的系数向量(见上段)。现在,如果您的信号是 b 并且您想要找到最能对方波求和以近似 bx,那么您所要做的就是求解 A*x=b。在 Matlab 中,这是由

给出的
x = A \ b;

剩下的只是线性代数。如果存在 A 的左逆矩阵(即,如果 A 具有维度 M x N 和等级 N,其中 M > N),则 (A^-1) * A 是单位矩阵并且

(A^-1) * A * x = (A^-1) * b,

这意味着 x = (A^-1) * b,这就是 x = A \ b; 在 Matlab 中将 return 的意思。如果 A 具有维度 M x N 和秩 M,且 N > M,则系统欠定且左逆不存在。在这种情况下,您必须使用伪逆来求解系统。现在假设 A 是 NxN,秩为 N,因此左逆和右逆都存在。在这种情况下,x 将给出 b:

的精确表示
x = (A^-1) * b
A * x = A * (A^-1) * b = b

如果您想要一个 A 使用方波来精确表示输入信号的示例,请查看 Haar 变换。有可用的函数 here