我知道ifft从对信号进行fft得到的数据中得到多个正弦波。是否有办法使用方波而不是正弦波来实现ifft?
我不是想把原始信号拿回来,而是尝试用从fft中提取的数据来重建它,而不是正常的正弦波求和过程。
参见下面的简单示例:我将使用的信号是大约60秒长的人类音频信号,因此我试图看看是否可以以某种方式使用/更改ifft命令。
PS:我使用的是Octave 4.0,类似于Matlab
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')

发布于 2017-12-29 20:38:18
定义你想要使用的基向量,让它们成为矩阵的列。如果b是你的信号,那么就得到Ax =b的最小二乘解。如果A是满秩,那么你就能精确地表示b。
编辑:
想一想矩阵-向量积的作用:矩阵的每一列乘以向量的对应元素(即矩阵的第n^列乘以向量的n^th元素),得到的乘积被相加在一起。(如果这个站点支持乳胶,这将更容易说明。)在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和秩N,且M> N),则(A^-1) * A是一个恒等矩阵
(A^-1) * A * x = (A^-1) * b,这意味着x = (A^-1) * b,也就是x = A \ b;将在Matlab中返回的内容。如果A具有维数M和秩M,且N> M,则该系统是欠定的,且不存在左逆。在这种情况下,您必须使用psuedo逆来求解系统。现在假设A是秩N的NxN,所以左逆和右逆都存在。在本例中,x将给出b的精确表示。
x = (A^-1) * b
A * x = A * (A^-1) * b = b如果您想要一个使用方波来精确表示输入信号的A示例,请检查Haar变换。有一个可用的这里函数。
https://stackoverflow.com/questions/48023960
复制相似问题