首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用方波和代替正弦波和来重建信号。

用方波和代替正弦波和来重建信号。
EN

Stack Overflow用户
提问于 2017-12-29 14:17:30
回答 1查看 613关注 0票数 1

我知道ifft从对信号进行fft得到的数据中得到多个正弦波。是否有办法使用方波而不是正弦波来实现ifft

我不是想把原始信号拿回来,而是尝试用从fft中提取的数据来重建它,而不是正常的正弦波求和过程。

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

PS:我使用的是Octave 4.0,类似于Matlab

代码语言:javascript
复制
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')

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-29 20:38:18

定义你想要使用的基向量,让它们成为矩阵的列。如果b是你的信号,那么就得到Ax =b的最小二乘解。如果A是满秩,那么你就能精确地表示b。

编辑:

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

代码语言:javascript
复制
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是你使用的方波数。现在让我们

代码语言:javascript
复制
A = [s1, s2, ..., s_M];

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

代码语言:javascript
复制
x = A \ b;

剩下的只是线性代数。如果存在A的左逆(即A的维数M和秩N,且M> N),则(A^-1) * A是一个恒等矩阵

代码语言:javascript
复制
(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的精确表示。

代码语言:javascript
复制
x = (A^-1) * b
A * x = A * (A^-1) * b = b

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48023960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档