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

时间:2017-12-29 14:17:31

标签: matlab fft octave discrete-mathematics ifft

我知道,ifft可以从数据获得的多个正弦波中获得信号上的fft。有没有办法用方波代替正弦波来做 ifft ? 我不是试图恢复原始信号,而是尝试使用来自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')

Image

1 个答案:

答案 0 :(得分:1)

定义你想要使用的基础向量,让它们成为矩阵的列,A。如果b是你的信号,那么只需得到Ax = b的最小二乘解。如果A是满级,那么你将能够完全代表b。

编辑:

考虑矩阵向量乘积的作用:矩阵的每一列乘以向量的对应元素(即,矩阵的第n列乘以向量的第n个元素)并将得到的产品汇总在一起。 (如果这个网站支持乳胶,这将更容易说明。)在Matlab中,一个可怕但有希望说明的方法是

@PostMapping("/product")
public String saveOrUpdateProduct(Product product){
    Product savedProduct = productService.saveOrUpdate(product);
    return "redirect:/product/"+savedProduct.getId();
}

(当然,你永远不会真正做到这一点,而是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 。)

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

b = A*x;

根据您的问题,您希望将信号表示为这些方波的加权和。 (注意,这正是DFT所做的只是使用正交正弦波而不是方波。)要对这些方波进行加权和求和,您所要做的就是找到矩阵向量乘积A = [s1, s2, ..., s_M]; ,其中{{ 1}}是对每列进行加权的系数向量(参见上一段)。现在,如果您的信号为A*x,并且您希望找到最适合方波的x以近似b,那么您所要做的就是解决{{} 1}}。在Matlab中,这是由

给出的
x

其余的只是线性代数。如果b的左逆存在(即,如果A*x=b的维度为M x N且秩为N,且M> N),那么x = A \ b; 是一个单位矩阵

A

表示A,这是(A^-1) * A将在Matlab中返回的内容。如果(A^-1) * A * x = (A^-1) * b, 的维度为M x N且秩为M,则N> M,则系统欠定,左逆不存在。在这种情况下,您必须使用psuedo-inverse来解决系统问题。现在假设x = (A^-1) * b是NxN,其等级为N,因此左右逆都存在。在这种情况下,x = A \ b;会准确表示A

A

如果您想要一个使用方波来获得输入信号精确表示的x示例,请查看Haar变换。有一个功能here