아래 포스팅에서 Autohotkey 의 argument 를 사용하는 방법에 대해 소개한 적이 있습니다. Autohotkey 에서 기존의 방법으로 argument 처리를 해 본 분들은 아시겠지만 %0%, %1% 등으로 표현이 되서 약간 이해가 쉽지 않았던게 사실 입니다.

https://iamaman.tistory.com/1635

그런데 최근에 아래 주소의 Autohotkey 문서를 다시 보다보니~ 1.1.27 버전 부터 A_Args 라는 키워드가 생긴것을 확인 할 수 있었습니다.

https://www.autohotkey.com/docs/Scripts.htm#cmd

이렇게 보니 이제 다른 프로그래밍 언어들과 그 사용방법이 거의 차이가 없는것 같네요~

Autohotkey help 문서에 있는 아래와 같은 예제를 한번 돌려보면 그냥 바로 이해가 되실 겁니다.

arg1 := A_Args[1] ; 첫번째 parameter

arglen := A_Args.Length() ; parameter 길이

MsgBox arg length : %arglen%

MsgBox arg1 : %arg1%

for n, param in A_Args ; For each parameter:

{

MsgBox Parameter number %n% is %param%.

}

위 코드에서 보시는 바와 같이 대괄호 인덱스를 사용하여 각 parameter 값을 얻을 수 있고~ Length() 함수를 통해 argument 의 갯수를 알 수 있습니다.

위 코드를 실행하기 위해서는 cmd 창이나 Powershell 과 같은 터미널에서 argument 를 줘야하는데~ 아래 그림과 같이 argument 들은 공백으로 구분을 하고 argument 에 공백이 포함된 경우에는 따옴표(“) 로 묶어 줘야 합니다.

그런데 이렇게 CMD 창에 실행하는건 불편하니까~ argument 가 있는 Autohotkey 코드를 개발 할 때는 scite4autohotkey 에서 View -> Parameters (Shift + F8)창을 열어서 사용하면 편리합니다. 


아래 화면은 보시는 바와 같이 3개의 argument 를 설정한 예입니다. Set 을 누르면 Parameters 창은 사라지고 scite4autohotkey 에디터에서 Run 을 눌러주면 해당 Parameters 들이 순서대로 입력 되게 됩니다.

argument 는 보통 Drag & Drop 을 통해서도 입력 할 수 있는데 위 링크의 문서를 보면 ~ NTFS 파일 시스템에서 8-dot-3 이름이 해제된 경우에는 Drag & Drop 이 실패 할수 있다고 하더군요. 이런 경우에는 해당 Autohotkey 파일을 compile 해서 실행파일(exe) 로 만들면 된다고 합니다.

8-dot-3 (short) name 이 뭔가 해서 검색을 조금 해 보니 오래된 도스 버전에서 사용하던 이름 규칙이라고 하네요.

https://ko.wikipedia.org/wiki/8.3_파일_이름

뭐 그럴일은 별로 없겠지만~ 아래 문서를 보니 fsutil.exe 를 사용하여 8-dot-3 (short) name 기능을 Enable, Disable 할 수 있다고 합니다.

https://support.microsoft.com/en-us/help/121007/how-to-disable-8-3-file-name-creation-on-ntfs-partitions



MATLAB 을 사용하여 압축을 하고 싶으면 zip() 이라는 함수를 사용 합니다.

 

현재 폴더의 하위 내용들을 압축하고 싶은 경우 보통은 현재 폴더를 압축하곤 하는데 이렇게 하려면 현재 폴더가 아닌곳에 zip 파일을 저장해야 합니다.

 

오늘은 현재 폴더 하위의 내용들을 압축하는 방법에 대해 소개하려 합니다.

 

현재 폴더의 내용을 검색하는 방법은 dir() 이라는 함수를 사용합니다. dir() 함수는 recursive 한 파일 검색은 되지 않습니다.

 

recursive 한 파일 검색을 하고 싶다면 아래 포스팅을 참조하시면 됩니다.

 

http://iamaman.tistory.com/757

 

아무튼 오늘은 그냥 현재 폴더에 대해서만 검색 할것이므로 dir() 함수를 사용합니다.

 

그런데 dir() 함수를 사용하여 현재 폴더를 검색하면 '.', '..' 라는 폴더가 검색 됩니다.

 

바로 현재와 상위 폴더 입니다.

 

현재 폴더의 하위 내용들을 압축하고 싶기 때문에 그래서 이 부분들을 제외하고 압축을 해야 합니다.

 

위 소개한 부분들을 제외하고 압축을 하는 방법은 아래 코드와 같습니다.

 

a= dir('.');

fileAll=cell(length(a),1);

 

for n=1:length(a)

    if ~(strcmp(a(n).name,'.') || strcmp(a(n).name,'..'))

        fileAll{n}=a(n).name;

    end

end

 

AllFile=fileAll(~cellfun('isempty',fileAll));

zip('CurrentFolder.zip',AllFile);

 


이번 포스팅에서는 FFT 를 이용한 고속 convolution 에 대해 알아본다.

 

일반적으로 conv(x, y) 은 filter() 함수로 구현되는 선형 convolution 이다.

 

선형 convolution 은 x 또는 y 의 길이가 증가할수록 그 복잡도는 급격히 증가하는 특징이 있다.

 

이러한 선형 convolution 은 순환(Circular) convolution 을 이용하여 구현이 가능하며, 순환 convolution 은 FFT(Fast Fourier Transform) 와 IFFT(Inverse Fast Fourier Transform)를 이용하여 구현이 가능하다.

 

일단 선형 convolution 을 순환 convolution 으로 변환하는 과정에 대해 살펴 보자.

 

x=[1 2 3 4]

 

y=[1 4 5]

 

위 신호를 이용하여 다음과 같이 convolution 을 하면

 

Z=conv(x,y)

Z =

1 6 16 26 31 20

 

Z는 6 개의 인자를 갖는 수가 나온다. 이는 x 의 길이가 4 이고 y 의 길이가 3 이므로 length(x) + length(y) – 1 = 4+3-1 = 6 에 따른 결과 이다.

 

위에서 실행한 conv() 을 순환 convolution 함수 cconv() 을 이용하여 구성해 보자. 참조 : cconv() 함수는 signal Processing Toolbox 에 포함되어 있다.

 

  • x 값을 6 개의 인자를 갖도록 뒤 부분에 0 을 2개 채워준다.

 

x1=[1 2 3 4 0 0]

 

  • y 값도 6 개의 인자를 갖도록 뒤 부분에 0 을 3개 채워준다.

 

y1=[1 4 5 0 0 0]

 

  • 위 두 벡터를 순환 convlution 한다.

 

Z_cconv=cconv(x1,y1, 6)

Z_cconv =

1.0000 6.0000 16.0000 26.0000 31.0000 20.0000

 

 

위 결과를 보면 선형 convolution 과 순환 convolution 의 결과가 동일함을 확인 할 수 있다.

 

이제 순환 convolution 과 FFT 사이의 관계를 알아보자.

 

(x 와 y 의 circular convolution) = IFFT(FFT(x)FFT(y)) 의 관계가 있다.

 

위에서 실행했던 순환 convolution 을 FFT, IFFT 를 이용하여 처리해 보자.

 

Z_fast=ifft(fft(x,6).*fft(y,6)) 을 실행하면 다음과 같은 결과가 나오며 이는 처음 실행했던 선형 convolution 의 결과와 동일한 것을 확인 할 수 있다.

Z_fast=

1.0000 6.0000 16.0000 26.0000 31.0000 20.0000



+ Recent posts