2017-12-29 41 views
1

ifft는 신호에서 fft를 수행하여 얻은 데이터에서 여러 사인파를 합산합니다. ifft을 사용하는 방법이 사인파 대신에 사각 파을 사용하고 있습니까?
원래 신호를 되 찾으려는 것이 아니라 일반적인 사인파 합계 프로세스 대신 fft에서 가져온 데이터의 구형파를 사용하여 다시 작성하려고합니다.ifft 및 사인파의 합 대신에 사각파의 합을 사용하여 신호를 다시 작성하십시오.

아래의 간단한 예제를 참조하십시오. 내가 사용할 신호는 약 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') 

Image

+2

참조 : https://dsp.stackexchange.com/questions/32453/how-can-i-decompose-a-signal-into-square-waves? –

답변

1

사용할 기저 벡터를 정의하고 그 매트릭스, A. 만일의 열하자 b가 신호라면 Ax = b에 대한 최소 제곱 해를 구하십시오. A가 전체 등급이면 b를 정확하게 나타낼 수 있습니다.

편집 :

매트릭스 - 벡터 제품이 무엇 생각해 : 행렬의 각 열 벡터의 해당 요소를 곱 (즉, 행렬의 제 n^열째는 N 곱 벡터의^요소)와 결과 곱이 함께 합산됩니다. (이 사이트는 라텍스를 지원하는 경우이 설명하기 위해 훨씬 쉽게 될 것입니다.) 매트랩,이 작업을 수행하는 끔찍한 그러나 희망 설명 방법은 물론, 실제로 위가 아니라 b = A*x;을하지 않을 것이다 (

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은 사용중인 구형파의 수입니다. 지금

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

귀하의 질문에 따라 신호를 이러한 구형파의 가중치 합으로 나타내기를 원합니다. (정확히 DFT가 구형파가 아닌 직각 사인 곡선을 사용하는 것입니다.)이 구형파를 가중치를주고 합산하려면 행렬 벡터 곱 A*x을 찾아야합니다. 여기서 x은 계수의 벡터입니다 각 컬럼의 무게를 잰다 (위 단락 참조). 자, 신호가 b이고 에 근사하기 위해 방형 파를 가장 잘 합친 x을 찾으려면 A*x=b을 해결하면됩니다. Matlab에서 이것은

x = A \ b; 

으로 나머지는 그냥 선형 대수입니다. A의 좌측 역이 존재하지 않으면 (A 치수 M> N과 M의 X N 랭크 N가있는 경우, 즉,), 다음 (A^-1) * Ax = (A^-1) * b을 의미 항등 행렬과

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

, 무엇입니다 x = A \ b;이 Matlab에서 반환됩니다. A이 M> N이고 M> N 인 차원을 갖는 경우 시스템은 미결정이고 왼쪽 - 역변환은 존재하지 않습니다. 이 경우 시스템을 해결하기 위해 psuedo-inverse를 사용해야합니다.A이 계급 N으로 NxN이고, 따라서 좌 우 반전이 존재한다고 가정합니다. 당신이 입력 신호의 정확한 표현을 얻을 수 구형파를 사용 A의 예를 원하는 경우 변환 하르을 확인,

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

이 경우, xb의 정확한 표현을 제공 할 것입니다. 사용할 수있는 기능은 here입니다.

+0

응답 해 주셔서 감사합니다.하지만 예제가 있습니까? 또한 이것은 나에게 이해가되지 않습니다 .... ""A가 풀 랭크라면, 당신은 b를 정확히 나타낼 수 있습니다. " –

+0

@RickT 제 편집을보세요. 잘하면 도움이됩니다. – AnonSubmitter85