Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab ifft和使用方波之和而不是正弦波之和重建信号_Matlab_Fft_Octave_Discrete Mathematics_Ifft - Fatal编程技术网

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

Matlab ifft和使用方波之和而不是正弦波之和重建信号,matlab,fft,octave,discrete-mathematics,ifft,Matlab,Fft,Octave,Discrete Mathematics,Ifft,我知道ifft从对信号进行fft得到的数据中求和多个正弦波。是否有一种方法可以使用方波而不是正弦波进行ifft? 我不是想把原始信号拿回来,而是想用fft数据中的方波来重建它,而不是正常的正弦波求和过程 请看下面的简单示例:我将使用的信号是大约60秒长的人类音频信号,因此我尝试看看是否可以以某种方式使用/更改ifft命令 PS:我使用的是类似于Matlab的倍频程4.0 clear all,clf reset, clc,tic Fs = 200; % Sampling frequency t=l

我知道ifft从对信号进行fft得到的数据中求和多个正弦波。是否有一种方法可以使用方波而不是正弦波进行ifft
我不是想把原始信号拿回来,而是想用fft数据中的方波来重建它,而不是正常的正弦波求和过程

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

PS:我使用的是类似于Matlab的倍频程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元素),所得的乘积相加。(如果该站点支持latex,那么说明起来就容易多了。)在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
,你想找到能最好地求和方波的
x
,以近似
b
,那么你所要做的就是求解
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中返回。如果
A
的维数为M x N,秩为M,且N>M,则系统未充分确定,且不存在左逆。在这种情况下,必须使用psuedo逆解来求解系统。现在假设
A
是秩为N的NxN,因此左逆和右逆都存在。在这种情况下,
x
将给出
b
的精确表示:

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

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

请参阅:?感谢您的回复,但您是否有一个示例?另外,这对我来说没有任何意义……
“如果A是满秩,那么您将能够准确地表示b。”