DSP : Vector Multiplier

 

 

// Advanced DSP : Vector Multiplier 
// DSD week 6

module MAC(
    input  wire         clk_i,
    input  wire         rstn_i,
    input  wire         dsp_enable_i,
    input  wire  signed   [7:0]  dsp_input_i,
    input  wire  signed   [7:0]  dsp_weight_i,
    input  wire         dsp_valid_i,  //모든 input이 입력 되었다. 
    output reg   signed   [31:0] dsp_output_o,
    output reg          dsp_valid_o
    );
    
    reg signed [30:0] partial_sum;
    reg delay;
    wire [31:0] dsp_output;
    
    always@ (posedge clk_i or negedge rstn_i) begin
        if(!rstn_i) begin
            partial_sum<= 0;
        end
        else begin
           partial_sum<= $signed({dsp_output[31], dsp_output[29:0]});
        end
    end

 always@ (posedge clk_i or negedge rstn_i) begin
    if(!rstn_i) begin
            dsp_valid_o<= 0;
            delay<= 0;
        end
        else begin
            delay<= dsp_valid_i;
            dsp_valid_o<= delay;
        end
    end
    
    always@ (posedge clk_i or negedge rstn_i) begin
        if(!rstn_i) begin
            dsp_output_o<= 0;
        end
        else if(dsp_valid_o) begin
            dsp_output_o<= dsp_output;
        end
        else begin
            dsp_output_o<= 0;
        end
    end
    
    dsp_macro_0 DSP_for_MAC(
        .CLK(clk_i),  // input wire CLK
        .CE(dsp_enable_i),    // input wire CE
        .A(dsp_input_i),       // input wire [7 : 0] A
        .B(dsp_weight_i),     // input wire [7 : 0] B
        .C(partial_sum),       // input wire [30 : 0] C
        .P(dsp_output)        // output wire [31 : 0] P
    );
endmodule

 

 

`timescale 1ns / 1ps
module tb_MAC();
    reg clk; 
    reg rstn; 
    reg dsp_enable;
    reg signed [7:0] dsp_input;
    reg signed [7:0] dsp_weight;
    reg dsp_valid_i;
    wire dsp_valid_o;
    wire signed [31:0] dsp_output;

    // make clock (frequency : 100MHz)
    initial begin
        clk= 0;
        forever
            #5  clk= ~clk;
    end
    
    //reset all system
    initial begin
            rstn= 1;
       #20  rstn= 0; dsp_enable= 0; dsp_input= 0;
            dsp_weight= 0; dsp_valid_i= 0;
       #10  rstn= 1;
    end
    
    initial begin
        #40 
        wait(rstn);
        #15    dsp_enable= 1; dsp_input= 1; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 2; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 3; dsp_weight= -1;
        
        #10    dsp_enable= 1; dsp_input= 4; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 5; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 6; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 7; dsp_weight= -1;
        #10    dsp_enable= 1; dsp_input= 8; dsp_weight= -1; 
        dsp_valid_i= 1;        
        #10    dsp_enable= 0; dsp_input= 0; dsp_weight= 0; 
        dsp_valid_i= 0;
        #10    dsp_enable= 0; dsp_input= 0; dsp_weight= 0; 
        end
        initial begin
        #100
        wait(dsp_weight== 0);
        #20
        $stop();
    end
    MAC dut(
        .clk_i(clk),
        .rstn_i(rstn),
        .dsp_enable_i(dsp_enable),
        .dsp_input_i(dsp_input),
        .dsp_weight_i(dsp_weight),
        .dsp_valid_i(dsp_valid_i),
        .dsp_valid_o(dsp_valid_o),
        .dsp_output_o(dsp_output)
        );
 endmodule

 

gemv

 

module gemv(
    input wire          rstn_i,                               //Reset signal
    input wire          clk_i,                                //Clock signal
    input wire          en_i,                                 //Enable signal for DSP
    input wire          valid_i,                              //Test validity of input signal: High if all input and weight signal are input
    input wire [127:0]  din_i,                                //16X8 Matrix input: Receive matrix in one row
    input wire [7:0]    win_i,                                //8X1 Vector weight
    
    output reg          valid_o,                              //Verifying signal thet calculation is done
    output reg [511:0]  gemv_o                                //Result of calculation
    ); 
    
    wire [31:0] mac_outputs [15:0];                           //Calculated signal of each 16 MAC: Each output signal of MAC is 32bit
    wire valid_w [15:0];                                      //Varifying signal that calculation is done: For each 16 MAC 
    
    genvar i;                                                 //Declare generate variable
    generate 
        for (i = 0; i < 16; i = i + 1) begin : gen_mac        //Create module instance 16 times: Since input matrix is '16'X8
            MAC mac_inst (
                .clk_i           (clk_i),
                .rstn_i          (rstn_i),
                .dsp_enable_i    (en_i),
                .dsp_input_i     (din_i [(i*8)+7:i*8]),       //For next starting index genvar i, start at (index started before) + 8: Since matrix is expressed in one row
                .dsp_weight_i    (win_i),
                .dsp_valid_i     (valid_i),
                .dsp_output_o    (mac_outputs [i]),
                .dsp_valid_o     (valid_w [i])
            );
        end
    endgenerate

    always @(*) begin
        valid_o = valid_w[0];                                                               //Use first valid signal only
        gemv_o = {mac_outputs[15], mac_outputs[14], mac_outputs[13], mac_outputs[12],       //Concentrate all 16 MAC outputs into GEMV output
                  mac_outputs[11], mac_outputs[10], mac_outputs[9], mac_outputs[8],
                  mac_outputs[7], mac_outputs[6], mac_outputs[5], mac_outputs[4],
                  mac_outputs[3], mac_outputs[2], mac_outputs[1], mac_outputs[0]};
    end

endmodule

 

 

`timescale 1ns / 1ps
module tb_gemv();
    reg               clk;   
    reg               rstn;  
    reg               valid_i; 
    reg               en; 
    reg     [127:0]   din;    
    reg     [7:0]     win;     
    wire              valid_o;   
    wire    [511:0]   gemv;
    
    // make clock (frequency : 100MHz)
    initial begin
        clk=0;
        forever
        #5  clk= ~clk;
    end
    //reset all system
    initial begin
        rstn= 1;
        #20     rstn= 0; en= 0; valid_i= 0;  din = 0; win = 0; 
        #10     rstn= 1;
    end
     
    initial begin
        #40 
        wait(rstn);
        #15    en= 1; din = {8'h01, 8'h02, 8'h01, 8'h02, 8'h01, 
        8'h02, 8'h01, 8'h02, 8'h01, 8'h02, 8'h01, 8'h02, 8'h01, 8'h02, 
        8'h01, 8'h02}; win = 8'h01;               
        #10    en= 1; din = {8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 
        8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 
        8'h03, 8'h04}; win = 8'h02;              
        #10    en= 1; din = {8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 
        8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 
        8'h05, 8'h06}; win = 8'h03;
         #10    en = 1; din = {8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 
        8'h08, 8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 
        8'h08, 8'h07, 8'h08}; win = 8'h04;
         #10    en = 1; din = {8'h01, 8'h02, 8'h01, 8'h02, 
        8'h01, 8'h02, 8'h01, 8'h02, 8'h01, 8'h02, 8'h01, 8'h02, 
        8'h01, 8'h02, 8'h01, 8'h02}; win = 8'h05;
         #10    en= 1; din = {8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 
        8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 8'h03, 8'h04, 
        8'h03, 8'h04}; win = 8'h06;
         #10    en= 1; din = {8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 
        8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 8'h05, 8'h06, 
        8'h05, 8'h06}; win = 8'h07;
         #10    en = 1; din = {8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 
        8'h08, 8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 8'h08, 8'h07, 
        8'h08, 8'h07, 8'h08}; win = 8'h08;
         valid_i = 1;      
        #10    en = 0; din = 0; win = 0; valid_i = 0;
         #10    en = 0; din = 0; win = 0; 
    end
    
    initial begin
        #100
        wait(win == 0);
        #20
        $stop();
     end
     
     gemv dut(
         .clk_i(clk),
         .rstn_i(rstn),
         .valid_i(valid_i),
         .en_i(en),
         .din_i(din),
         .win_i(win),
         .valid_o(valid_o),
         .gemv_o(gemv)    
        );
endmodule

 

 

 

'Digital System Design' 카테고리의 다른 글

MAC  (0) 2025.04.01

정보를 보내기 위해서는 캐리어 신호(이후 c(t))에 정보(이후 m(t))를 실어서  보내야 한다. 이것이 우리가 알고있는 변조의 기본 개념이다. 

이러한 형테의 c(t)에서 Ampitude(Ac)를 변화시키는 방법을 Amplitude Modulation(AM)이라고 한다. 정보를 c(t)의 지폭 부분에 담는다. 반대로 ftrquency부분을 변조하는 것을 FM이라고 한다. 이번 장에서는 AM family에 대해 공부해 볼 것이다.

 

Amplitude Modulation

 

위에 있는 신호의 진폭부분에 m(t)가 들어간 모습을 볼 수 있다. 하지만 그냥 m(t)가 아닌 다른 형태의 모습을 볼 수 있는데 이에 대해 생각해보자.

AM신호를 복조하는 방법은 Envelope detect가 있다. Envelope은  s(t)의 amplitude를 연결 한 선이다. 

 

첫번째 그림이 m(t)이고 두번째 그림이 정상적인 형태의 s(t)이다. 파란색으로 표시한 부분이 바로 envelope이 된다. 복조를 하는 부분은 항상 주파수의 진폭의 윗부분을 이어놓은 부분이다. 만약 아래의 그림 처럼 zero crossing part가 생기면 진폭이 반전되고 그 부분을 복조하기 떄문에 의도하지 않은 m(t)를 복조하게 된다. 따라서 m(t)의 zero crossing을 없애주기 위해 m(t)에 k(0<k<1)를 곱하고 DC성분 1을 더해주는 것이다.

또한 m(t)의 가장 큰 주파수(W)보다 c(t)의 주파수가 훨씬 커야된다. f_c >>> W

s(t)를 푸리에변환 해보면 위처럼 캐리어부분과 메시지 부분이 보인다. 

 

AM Modulated spectrum을 보면  M(f)가 fc, -fc로 shift된 부분과 fc, -fc에서의 peak가 보인다. 좌우 끝쪽 부분을 upper sideband, 안쪽 두 부분을 lower sideband라고 한다. bandwidth가 W에서 2W로 두배 증가 한 것을 볼 수 있다.

 

 

Single Tone Modulation

 

 

m(t)의 주파수 성분이 f_m으로 single tone이다. AM modulated wave를 보면 μ (modulation factor)를 볼 수 있다.  0<μ<1이어야 한다.  만약 1보다 크게 되면 위에서 본 것처럼 과적변조가 발생하여 신호가 왜곡된다.

 

 

s(t)를 살펴보면 두 개의 term으로 나눠진다. 1st term은 carrier부분으로 message를 담고 있지 않다. s(t)의 spectrum을 생각해보면 1st term에서 2개, 2nd term 에서 4개로 총 6개의 peek가 생길 것이다. 

 

 

즉, 변조율이 100%가 되어도 정보의 전력은 전체 전력의 33%밖에 되지 않는다. AM변조는 uper, lower sideband를 모두 보내고, carrier신호도 보내므로 전력이 너무 많이 소모된다. 또한 상하측파대를 모두 사용하므로 대역폭또한 많이 필요하다. 하지만 복조할 때 매우 간단한 구조로 할 수 있다는 장점이 있다. 

 

// MAC.v

 

`timescale 1ns / 1ps

module MAC(rstn_i,clk_i,dsp_enable_i,dsp_input_i, dsp_weight_i,dsp_output_o);
    input rstn_i,clk_i,dsp_enable_i;
    input [7:0] dsp_input_i, dsp_weight_i;
    output [31:0] dsp_output_o;
    
    reg [30:0] partial_sum;

dsp_macro_0 my_module (
  .CLK(clk_i),  // input wire CLK
  .CE(dsp_enable_i),    // input wire CE
  .A(dsp_input_i),      // input wire [7 : 0] A
  .B(dsp_weight_i),      // input wire [7 : 0] B
  .C(partial_sum),      // input wire [30 : 0] C
  .P(dsp_output_o)      // output wire [31 : 0] P
);

    always @(posedge clk_i or negedge rstn_i)
        begin
            if (!rstn_i)
                begin
                    partial_sum <= 0;
                            end    
            else if (dsp_enable_i)
                begin
                    partial_sum <= { {1{dsp_output_o[30]}}, {dsp_output_o[29:0]} };
                    // sign-bit 데이터 보존
                end
        end

endmodule

 

 

// tb_MAC.v

 

`timescale 1ns / 1ps
module tb_MAC();
    reg clk;
    reg rstn;
    reg dsp_enable;
    reg signed [7:0] dsp_input;
    reg signed [7:0] dsp_weight;
    wire signed [31:0] dsp_output;
    // make clock (frequency : 100MHz)
    initial begin
        clk = 1;
        forever
            #5 clk = ~clk;
    end
//reset all system

    initial begin
        rstn = 1;
            #20 rstn = 0;
        dsp_enable = 0; dsp_input = 0; dsp_weight = 0;
            #10 rstn = 1;
    end
    
    initial begin
        #40
        wait(rstn);
        #10 dsp_enable = 1; dsp_input = 1; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 2; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 3; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 4; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 5; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 6; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 7; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 8; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 9; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 10; dsp_weight = -1;
        #10 dsp_enable = 1; dsp_input = 1; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 2; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 3; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 4; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 5; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 6; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 7; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 8; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 9; dsp_weight = 1;
        #10 dsp_enable = 1; dsp_input = 10; dsp_weight = 1;
        #20 dsp_enable = 0; dsp_input = 0; dsp_weight = 0;
    end
    
    initial begin
        #100
        wait(dsp_weight == 0);
        #20
        $stop();
    end
MAC dut(
.clk_i(clk),
.rstn_i(rstn),
.dsp_enable_i(dsp_enable),
.dsp_input_i(dsp_input),
.dsp_weight_i(dsp_weight),
.dsp_output_o(dsp_output)
);

endmodule

 

 

 

 

 

`timescale 1ns / 1ps

module pipelined_adder_tree(
    input clk_i, rstn_i, en_i,
    input [15:0] din1_i, din2_i, din3_i, din4_i,
    output [17:0] dout_o
    );
    
    reg [16:0] stage1_sum[1:0]; // 17bit
    reg [17:0] stage2_sum; // 18bit
    
    
    always @(posedge clk_i or negedge rstn_i) begin  
        if(!rstn_i)begin
            stage1_sum[0] <= 0;
            stage1_sum[1] <= 0;
            stage2_sum <= 0;
        end
        else if(en_i) begin
            stage1_sum[0] <= din1_i + din2_i;    // Stage 1 (레지스터)  
            stage1_sum[1] <= din3_i + din4_i;    // Stage 2 (레지스터)  
            stage2_sum <= stage1_sum[0] + stage1_sum[1]; // Stage 3 (레지스터)  
        end  
    end

    assign dout_o = stage2_sum;  // Stage 3 출력
            
endmodule

 

 

// tb_pipelined_adder_tree.v
`timescale 1ns/1ps

module tb_pipelined_adder_tree();
    reg clk, rstn, en;
    reg [15:0] din1, din2, din3, din4;
    
    wire [17:0] result;
    
    pipelined_adder_tree dut (
    .clk_i(clk), .rstn_i(rstn), .en_i(en),
    .din1_i(din1), .din2_i(din2), .din3_i(din3), .din4_i(din4),
    .dout_o(result));
    
    
    initial begin
        clk = 0;
        forever begin
            #5 clk = ~clk;
        end
    end
    
    initial begin
        rstn = 1;
        #20 rstn = 0; din1 = 0; din2 = 0; din3 = 0; din4 = 0;
        #20 rstn = 1;
        end
        initial begin
        en = 0;
        #50 en = 1;
    end
    
    integer i;
    
    initial begin
        #60
        for (i = 0; i < 15; i = i + 1) begin
            din1 = din1 + i;
            din2 = din2 + i * 2;
            din3 = din3 + i * 4;
            din4 = din4 + i * 8;
            #10;
        end
            #50;
            $stop;
    end
    
endmodule

 

'Digital System Design' 카테고리의 다른 글

6주차  (0) 2025.04.19

o Fourier Transform by Numerical Computation

우리가 지금까지 다룬 많은 신호들은 수학적으로 표현하기 적합했다. 하지만 직관적으로 생각했을 때 대부분의 실제 신호들은 그렇지 않을 것이다. 따라서 우리는 이러한 신호들을 푸리에변환하기 위해 sampling을 한다. 신호를 sampling한다는 것은 delta함수들로 표현 한다는 것이고, 즉 discrete한 신호를 푸리에변환하겠다는 것이다.

 

x(t)를 N개의 신호로 sampling했을 때, X[k]는 아래와 같이 수학적으로 표현할 수 있다. 이러한 DFT는 N의 개수가 커질 수록 직접 계산하기가 어려워져 tool을 사용해야 한다. 어떻게 보면 tool을 이용해 계산하기 위해 sampling을 하는 것이다. 

 

수업시간에 한 cos(2pi t)를 매틀랩을 이용하여 DFT한 것을 보자.

 

먼저 fftshift함수에 대해 알아보자면, 영주파수 성분을 배열의 가운데로 이동시켜 푸리에 변환 X를 재배열하는 것이다. 이 과정이 왜 필요한지 생각해보자. sampling을 하여 푸리에변환을 하면 spectrum은 periodic하다. sampling을 하면 discrete해지니 당연하다. 그리고 그 spectrum의 주기는 sampling을 한 interval인 Ts의 역수인 fs일 것이다. 

매틀랩은 fftshift의 과정 없이 stem(X)를 하게되면 0Hz를 시작점으로 설정한다. 따라서 spectrum은 -1, 1Hz가 아닌 1Hz와 (1+fs)=3Hz에 나타난다. 이를 방지하고자 푸리에변환 후 재배열을 해주는 것이다.

 

 

 

교수님께서 수업 이후 매틀랩에서 위에 나온 정현파 신호(cos)를 DFT을 했을 때, peak가 2개가 아니라 이상한 spectrum들이 여러개가 나오게 되는 경우가 생기는데 왜 그런지 생각해 오라고 하셨다. 

바로 생각난 것은 "sampling을 너무 적게하면 원래의 함수를 복원할 수 없지 않을까?"였다. 그래서 먼저 에일리어싱에 대해 조사를 해봤다. 빨리 달리는 자동차의 바퀴가 뒤로가는 것 처럼 보이는 것을 에일리어싱이라고 한다고 알고있었다. 에일리어싱의 대략적인 내용은 신호의 주파수보다 sampling frequency가 2배이상 크지 않을 경우 발생하는 것이라고 한다. 하지만 이러한 경우를 cos함수에 적용해서 매틀랩에서 보았을 때, 여러 개의 스팩트럼이 나타나지는 않았다. 대신 원래 나타나야 할 주파수대신 다른 주파수에서 peak가 나타났다. 이를 유령 피크 라고 한다.

 

 

o Spectral Leakage(주파수 누설)

다음으로 periodic에 집중하였다. 우리는 특정 신호 x(t)를 sampling하고  sampling한 값들만 변환한다. 그리고 이 값들이 일정한 주기를 갖고 반복한다고 가정한다. 그렇다면 이상적인 sampling은 그 간격이 촘촘하고 x(t)의 한 주기여야 할 것이라는 생각을 했다. 만약 sampling한 값들이 한 주기, 혹은 한 주기의 정수배가 아니라면 sampling한 부분의 시작과 끝이 이어지지 않는 상황이 생긴다.

위의 사진처럼 정현파의 시작과 끝점이 이어지지 않는다면 저 부분을 채울 주파수 성분들이 많이 생길 것이다. 따라서 이를 matlab을 통해 확인해 봤다. 

위의 sampling은 1/4초 간격으로 64번 sampling을 한다. 따라서 총 16초동안 sampling을 하는데, x의 경우 주기가. 1.25초로 12.8주기를 sampling하므로 sampling의 처음과 끝이 다르다. 반면에 y의 경우 주기가 1.6초로 위와같이 샘플링을 하면 딱 맞아 떨어진다. 

 

 

이러한 spectrul leakage를 해결할 수 있는 방법으로는 윈도잉 이라는 것이 있다. 샘플링 한 부분의 시작과 끝을 자연스럽게 0으로 수렴시켜 시작과 끝을 일치시켜 주는 것이다. 

 

윈도우 함수를 이용하여 x(t)를 변형시킨 후 변환한 결과이다. 조금 더 정확한 모형으로 가까워 진 것을 확인할 수 있다.

 

o Unit Impulse Response

단위 임펄스 응답은 말 그대로 어떠한 시스템에 δ(t)를 입력으로 넣었을 떄의 응답을 말한다. 이 응답은 우리는 h(t)로 표기하는데 LTI시스템에서 h(t)를 알면 모든 입력에 대한 출력을 구할 수 있어서 매우 중요하다.

 

모든 입력신호 x(t)는 이와같이 델타함수와의 convolution으로 나타낼 수 있다.

 

입력 x(t)에 대한 출력 y(t)는 아래와 같이 입력신호와 임펄스 응답의 컨볼루션으로 나타낼 수 있다.

 

ex) 만약 어떤 LTI system의 임펄스 응답이 δ(t-10)이라고 해보자. 이 시스템은 단순지연 시스템이라는 것을 알 수 있다. 

입력신호 x(t)가 rect(t)라면 응답으로는 y(t)=rect(t-10)일 것이다. 이는 rect(t) * δ(t-10)이다.

 

 

 

o causality

system이 causal이라는 것은 입력이전에 응답이 없다는 것이다. 수힉적으로는 이렇게 표현할 수 있다.

Impulse response of the system is zero for negative region in time.

 

o stability

stability에는 여러 가지 종류가 있지만 우리는 BIBO(Bounded Input Bounded Output) stability 에 대해 다룰 것이다. Bounded는 "유계(有界)"라는 뜻으로, 쉽게 말해 신호가 특정 범위를 벗어나지 않는다는 의미이다.

 

Bounded Input 정확한 정의로는 시간 t에서 입력 x(t)의 크기가 어떤 유한한 값 M보다 작다는 것이다. ∣x(t)∣≤M

system이 BIBO stable하다는 것은 입력과 응답이 모두 bounded하다는 것이고 이러한 시스템은 h(t)의 적분 유한한지를 판별해 보면 된다. 

 

ex) h(t) = rect(t-5)이면 이 시스템은 causal이고 BIBO stable하다.

 

 

o Frequency Response

 

LTI 시스템에 복소지수함수 x(t)를 입력하면, 출력은 같은 주파수의 복소지수함수가 나온다. 다만 진폭과 위상이 시스템에 의해 H(f)만큼 바뀌는 것이다. 

 

어떤 입력 신호든 복소지수함수의 합으로 표현 가능하므로, H(f)를 알면 모든 입력에 대한 출력을 계산할 수 있다.

 

LTI system의 frequncy response는 Impulse respense의 푸리에변환이다. 따라서 아래와 같은 식이 나온다.

 

 

 

하나의 열만 가지는 행렬을 열백터 혹은 간단히 벡터라고 한다.

 

2개의 성분을 가지는 모든 벡터들의 집합을 R2로 표시한다.

 

 

Linear combination(일차결합)

 

다음 예제를 통해 일차결합을 자세히 이해해보자.

 

벡터방정식을 기하학적으로 해석하면 다음과 같다.

벡터 a1과 a2를 포함한 무한히 넓은 평면 위에 벡터 b가 있다면 a1과 a2의 일차결합으로 b가 생성될 수 있다.

 

 

 

벡터 v1,v2,…,vn의 Span은 이 벡터들의 모든 일차결합으로 이루어진 집합이다.

 

이를 수학적으로 표현하면 Span{v1,v2,,vn}={c1v1+c2v2++cnvn  c1,c2,,cnR}이다.

 

선형독립인 두 벡터 v1과 v2의 Span은 이 두 벡터가 이루는 평면 전체이다.

만약 두 벡터가 같은 방향(선형 종속)이면 Span{a1, a2}는 직선이 된다.

 

선형 독립인 세 벡터 v1, v2, v3의 Span은 이 세 벡터가 이루는 공간 전체가 된다. 즉, span{a1, a2, a3} = R3를 만족한다.

만약 세 벅테가 같은 평면에 있으면, span{a1, a2, a3} 은 평면이 된다.

 

 

A가 벡터 a1, a2, ... , an을 열로 하는 mxn행렬이고, 벡터b가 Rm의 원소이면

행렬방정식 Ax = b은 벡터방정식x1a1+x2a2+...+xnan=b 같은 해를 가진다.

 

즉, (벡터들을 열로하는 행렬)X(가중치를 성분으로 하는 벡터) 꼴의 벡터방정식의 해와

[a1 a2 ... an b]인 선형방정식의 선형계의 같은 해집합을 갖는다.

 

 

span을 이용한 예제를 풀어보자.

 

sapn(a1, a2) 벡터a1과 a2의 일차결합으로 생성된 원점을 지나는 무한히 넓은 평면이다.

벡터b가 이 평면에 속하는 것은 벡터방정식 x1a1+x2a2=b가 해를 갖는 것과 동일하다.(x1, x2는 가중치)

위의 벡터방정식의 첨가행렬을 구하면 아래와 같다.

마지막 기약사다리꼴 행렬의 마지막 행을 보면 0x2=-2라는 값이 나온다. 

따라서 x1a1+x2a2=b는 해를 갖지 않으며 b는 sapn(a1, a2)에 속하지 않는다는 것을 알 수 있다.

 

 

Matrix equations (행렬방정식)

행렬 방정식은 A x = b꼴로 나타내지며 A는 "벡터들을 열로 하는 행렬"이며 b는 "가중치를 성분으로 하는 벡터"이다.

이는 A의 열과 이에 해당하는 가중치 x의 성분과의 일차결합이다.

(Ax는 A의 열의 개수와 x의 성분의 개수가 같을 때에만 정의된다.)

이 식에서 A는 벡터 3개의 벡터 a1(1, 0), a2(2, -5), a3(-1, 3)을 열로 하는 행렬이다.

벡터 a1, a2, a3는 성분이 두개인 벡터이므로 R2의 원소이다.

벡터x는 각각의 가중치 x1=4, x2=3, x3=7를 성분으로 하는 벡터이다. 따라서 벡터 x는 R3의 원소이다.

 

 

o 선형계 vs 벡터방정식 vs 행렬방정식

 

다음은 각각의 해집합이 같은 선형계, 벡터방정식, 행렬방정식이다.

1) 선형계의 관점에서 보면 두 평면의 교점이 해가 된다. 즉 선형계의 첨가행렬이 아래의 두 경우와 같은 해집합을 갖는다.

2) 벡터방정식의 관점에서 보면 벡터 3개의 1차결합으로 우변의 벡터가 생성될 수 있으면 첨가행렬과 같은 해집합을 갖는다.

3) 벡터를 열로하는 mxn 행렬이고 벡터 b가 Rm의 원소이면 벡터방정식과 같은 해를 갖는다.

 

따라서 위의 선형계와 벡터, 행렬 방정식은 등가이다.

 

 

o 행렬방정식의 해의 존재성

 

행렬방정식 Ax=b가 해를 가질 필요충분조건은 벡터b가 A의 열의 일차결합인 것이다.

즉, 벡터b가 span(a1, a2, ... , an)에 속하는 것은 Ax=b기 해를 갖는 것과 동치이다.

 

즉, 벡터 a1, a2, a3의 일차결합 위에 벡터b가 존재하는지 생각해 보면 된다. 

Ax=b의 첨가행렬을 구하고 행축약 알고리즘을 통해 정리한 결과이다.

벡터 a3는 a1과 a2의 일차결합으로 만들어 진다. 따라서 span{a1, a2, a3}원점을 지나는 무한히 넓은 2차원 평면이다.

벡터b는 span(a1, a2)평면 위에 존재해야 방정식 Ax=b가 해를 갖는다.

 

b1-(1/2)b2+b3 = 0을 만족하지 않으면 선형계의 해는 존재하지 않는다. " b1-(1/2)b2+b3 = 0 "는 의미는 벡터b가 span(a1, a2)위에 존재하기 위해 만족해야 하는 조건이다.

즉, 벡터b가 a1과 a2의 일차결합으로 표현될 수 있으려면, 이 방정식을 만족해야 한다.

 

첨가행렬을 조금 더 자세히 살펴보자. 위 첨가행렬은 자유변수가 1개이다. 자유변수가 1개이면 span{a1, a2, a3}가 평면이 되는 것을 알 수 있다. 자유변수의 개수와 span{(A의 열벡터들)}의 관계, 그리고 해집합과의 관계에 대해 알아보자.

 

1. 행렬방정식의 해의 존재 여부

방정식 Ax=b가 해를 가지러면 벡터b가 행렬A의 열공간(column space)에 속해야 한다. 벡터b가 A의 열벡터들의 선형결합으로 표현될 수 있어야한다. 이를 확인하기 위해서는 첨가행렬 [ A | b ]를 사다리꼴 형태로 변환해보는 것이다.

 

("열공간( column space) : A의 열벡터들의 선형결합으로 만들어지는 공간. 즉, span{a1, a2, a3, ... , an} / 열공간의 차원은 A의 열벡터들 중 선형독립인 벡터들의 최대 개수와 같다.) 

("행렬 A의 랭크(rank) : A의 열공간의 차원을 의미.)

 

2. (첨가행렬의) 자유변수와 열공간의 관계

(행렬 A의 열벡터의 원소수) = (열공간의 차원) + (자유변수의 개수)를 만족한다.

이는 " Rank-Nullity Theorem "이라 하며 (행렬 A의 열벡터의 원소수) = (A의 랭크) + (널공간의 차원)이다.

 

ex)행렬 A=[a1, a2, a3]는 3x3행렬이고 열공간은 2차원이라고 하자 (span{a1, a2, a3}는 평면) . 이때 Ax=b를 만족하는 첨가행렬의 자유변수의 개수는 1개가 된다.

 

3. 자유변수의 개수와 해집합의 관계

자유변수의 개수는 해집합의 자유도를 결정한다. 자유변수가 1개라면 해집합은 하나의 매개변수로 표현될 수 있는 직선이 된다. 일반적으로 자유변수의 개수가 k개라면 해집합은 k차원의 공간을 형성한다.

 

 

A가 mxn행렬이라 할 때 다음의 명제는 동치이다.

(명제가 모두 참이거나 모두 거짓임)

 

1) Rm의 원소인 모든 벡터b에 대하여, Ax=b가 해를 가진다.

2) Rm의 원소인 모든 벡터b는 A의 열의 일차결합이다.

3) A의 열이 Rm을 생성한다.

4) A가 모든 행에서 주축위치를 가진다.

 

 

Homogeneous Linear Systems(동차선형계)

 

Ax = 0의 형태의 선형계를 동차(homogeneous)라고 한다. 동차선형계는 항상 적어도 하나의 해, 즉 x=0을 갖는다. 이 해를 trivial solution(자명한 해)라고 한다. 반대로 "자명하지 않은 해(nontrivial solution)"는 0가 아닌 해를 말한다.

 

동차방정식 Ax = 0이 자명하지 않은 해를 갖기 위한 필요충분 조건은 그 방정식이 적어도 1개의 자유변수를 가지는 것이다. 

위에선 언급한 Rank-Nullity Theorem을 생각해보면 자유변수가 k개 생기면 해집합의 차원이 k차원이 되니 k>0이면 해의 개수는 무수히 많아진다. 따라서 자유변수가 생기면 자명하지 않은 해룰 갖게 된다.

 

예제를 통해 자명하지 않은 해를 갖는지 살펴보자.

 

주어진 선형계를 첨가행렬로 나타낸 후 일반해를 구해보자. 자유변수가 존재하므로 자명하지 않은 해를 갖는다. 

이때 해집합을 벡터로 나타내면 (자유변수) x (벡터)의 꼴로 나타낼 수 있다.

 

자유변수가 두개인 일반해를 벡터로 표현하면 두 벡터의 합으로 나타낼 수 있다. 이 때 자유변수 x2, x3는 임의의 실수가 되다.

 

x = x3v, 혹은 x = x2u+x3v와 같은 방정식을 Parametric Vector Form(매개변수 벡터 형식) 이라고 한다.

x = x3v의 해집합은 원점을 지나는 직선, x = x2u+x3v의 해집합은 원점을 지나는 평면이 된다.

 

 

Solution of Nonhomogeneous System (비동차계의 해집합)

 

비동차계의 해가 많을 때, 일반해는 대응하는 동차계를 만족하는 벡터들의 임의의 일차결합에 벡터 하나를 더한 것과 같은 매개변수 벡터 형태로 쓸 수 있다.

 

위에서 다룬 동차계에 대응하는 비동차계 이다. x3v는 대응하는 동차계의 해집합이다. 따라서 Ax=b의 해집합은 x3vp를 더한 꼴로 나오게 된다. 이를 기하학적으로 생각하면 아래와 같다. 선형계의 자유변수가 1개이므로 동차계의 해집합은 원점을 지나는 직선( span{v} )이 된다.  span{v}에 벡터 p를 더했으니 평행이동으로 생각할 수 있다.

 

 

Linear Independence (일차동립)

 

벡터방정식 "x1v1 + x2v2 + x3v3 + ... + xpvp = 0"이 자명한 해만을 가질 때 Rn에 포합되는 벡터들의 집합 {v1, v2, v3, ... , vp} 일차독립 이라 한다. 

 

벡터들의 집합이 일차동립인지 판별하기 위해서는 그 벡터들을 열로하는 행렬A의 동차방정식이 자명한 해만을 갖는지 확인하면 된다. 즉, Ax = 0의 첨가행렬을 구해 자유변수의 유무를 구해보면 알 수 있다.

자유변수 x3을 가짐으로 v1, v2, v3는 일차 독립이 아니며 위와같은 종속관계를 갖는다.

 

 

o 일차 종속 판별

 

행연산을 할 필요 없이 일차 독립 여부를 확인할 수 있는 집합들을 살펴보자.

a) 각 벡터에 있는 성분의 개수보다 많은 수의 벡터를 포함하는 집합은 일차 종속이다.

b) Rn에서의 집합 S={v1, v2, ... , vp}가 영벡터(0)를 포함하면, S는 일차 종속이다.

c) 2개의 벡터를 가지는 집합은 한 벡터가 다른 벡터의 스칼라배이면 일차 종속이다.

 

 

Linear Transformations (선형 변환) 

 

선형변환은 행렬방정식 Ax = 0을 다른 관점으로 바라본 것이다. 백터 x에 곱셈 연산을 "작용"하여 Ax라 불리는 새로운 벡터를 만드는 대상으로 행렬A를 생각하는 것이다.

 

Rn에서 Rm으로의 변환(transformation, functions 또는 mapping)을 T로 나타낸다. Rn의 각 베터 xRm의 한 벡터 T(x)로 대응하는 것이다. 즉, 함수의 성질을 가진다. 집합Rn을 T의 정의역(domain), Rm을 T의 공역(codomain)이라 부른다. 벡터 T(x)를 x의 상(image)이라 부르고, 모든 상 T(x)들의 집합을 치역(range)이라 한다.

 

벡터 xR4의 원소이며 선형변환된 벡터 bR2의 원소이다. R4가 정의역 R2가 공역이 된다. 행렬 A가 이 변환에 작용했다고 생각할 수 있다.

 

o 행렬변환 (Matrix transformation)

A가 mxn행렬일 때 Rn에 속하는 각 x에 대하여 T(x)는 Ax로 계산된다.

T(x)의 각각의 상이 Ax 형태이므로 T의 치역은 A의 열에 관한 모든 선형결합으로 이루어진 집합이다.

 

 

(d)는 해가 존재하지 않으므로 c가 T의 치역에 속하지 않는다.

 

 

o 선형변환 (Linear transformation)

 

변환 T가 다음을 만족하면 선형(linear)변환 이라 한다.

1) T의 정의역에 속하는 모든 u, v에 대하여 T(u+v) = T(u) + T(v)를 만족한다.

2) T의 정의역에 속하는 모든 u와 임의의 스칼라 c에 대하여 T(cu) = cT(u)를 만족한다.

 

T가 선형 변환이면 T(0) = 0이다. 정의역의 0벡터가 공역의 0벡터로 변환된다. 어떠한 변환 T가 선형인가 판별하기 위해서는 T(cu  + dv) = cT(u) + dT(v), 그리고 T(0) = 0을 만족하는지, 보면 된다. (c, d는 임의의 스칼라이다.)

 

 

 

o 행렬의 선형변환

위와같은 2x2 항등행렬이 있다고 해보자. 이 행렬의 열벡터를 각각 e1, e2라고 하면 위와같이 나타낼 수 있다.

각 열벡터의 T(R2에서 R3로의 선형변환)에 대한 변환이 위와 같다. 그렇다면 임의의 x의 상(image)에대한 식을 아래와같이 구할 수 있다.

 

 

T : Rn -> Rm을 선형변환이라 하면 Rn의 모든 x에 대하여 T(x) = Ax를 만족하는 행렬 A가 유일하게 존재한다. 

A는 j번째 열이 벡터 T(ej)인 행렬이다. (ej는 Rn에서 항등행렬의 j번째 열이다.) 이러한 행렬 A는 선형변환 T에 대한  표준행렬(standard matrix)이라고 한다. 즉, 표준행렬은 항등행렬의 열들의 상(image)를 열로 하는 행렬이다.

 

 

변환 T가 x1=-1축에 대한 대칭이라 할 때 변환 T에 대한 표준 행렬을 구해보자.

 

그림과 같이 이 변환은 선형변환이 아님을 알 수 있다. 또한 정의역에서의 0에대한 변환도 (-2, 0)이므로 선형변환이 아님을 쉽게 판별할 수 있다. 따라서 이 변환은 선형변환이 아니므로 표준행렬을 구할 수 없다. 

 

 

1. 전사변환 (onto)

공역 Rm의 모든 b가 정의역 Rn에 속하는 적어도 한 x의 상이면,  T : Rn->Rm을 Rm으로의 전사변환 이라고 한다. 즉, 공역과 치역이 같거나, T(x) = b의 해가 적어도 하나 존재하면 T는 Rn에서 Rm으로의 "전사변환"이라고 한다.

 

2. 일대일 변환 ( one-to-one, 1:1)

Rm에 속하는 모든 b가 많아야 한 x의 상이면, T : Rn->Rm은 일대일 변환이라고 한다.

 

 

ex) R4->R3변환 T에 대한 표준행렬이 아래와 같다. 이 변환이 전사변환, 일대일변환 인지 알아보자.

 

먼저 전사변환인지 판별해보자. T(x)=Ax=b이다. 이는 벡터xb로 변환한 것을, A의 열들의 선형결합으로 b를 생성한다고 생각해보자. 치역은 A의 열들의 일차결합 즉, 열공간이 된다. 주축의 개수가 3개 이므로 열공간과 공역(R3)이 일치해 이 변환은 전사변환으로 판별할 수 있다.

공역(Rm) = 치역 = 열공간

 

일대일 변환은 Ax=0의 해집합을 통해 쉽게 판별할 수 있다. 동차계를 사용하는 이유는 원점(자명한 해)을 무조건 해로 가짐으로 자명하지 않는 해를 갖는지 판별하면 된다. 이 경우 첨가행렬을 나타냈을 때 자유변수가 존재하므로 자명하지 않은 해를 갖는다. 따라서 이 변환은 일대일 변환은 아니다. 

T(x)=Ax=0의 해집합 판별. 해가 오직 x=0 뿐이어야 함. 널 공간이 {0}만 포함.

 

즉, 위의 내용을 간단히 정리해보면 

T : Rn->Rm을 선형변환, A를 T에 대한 표준해열이라 하면, 

1) T는 Rn을 Rm으로의 전사변환이다 <-> A의 열들이 Rm을 생성한다.

2) T는 일대일 이다. <-> A의 열들은 일차독립이다. (Ax=0이 자명한 해만을 갖는다.)

 

'Engineering Mathematics' 카테고리의 다른 글

1. Linear Equations in Linear Algebra  (0) 2025.03.05

Bandwidth

o Bandwith

:significiant spectral content of the signal for positive frequencies.

 

위와 같이 rect함수의 bandwidth를 구해보면 쉽게 이해할 수 있다.

 

 

o Null-to-Null Bandwidth

: For the signal whose spectrum is symmetric with a main lobe by well defined nulls

sinc함수와 같이 Null이 잘 정의된 경우 main lobe의 길이를 Null-to-Null Bandwidth라고 한다.

그림에서 빨간색으로 표시된 부분이 main lobe이고 positive부분만 생각하면 첫번째 Null까지의 길이인 W가 된다.

 

 

o 3-dB Bandwidth

: Low-pass type signal에 사용되며 peak의 1/sqrt(2)지점이 되는 positive 부분의 길이를 나타낸다.

 

 

 

o Energy Signal 

signal energy가 finite하면 Energy signal이라고 한다.

우리가 지금까지 다룬 많은 함수들이 대부분 energy signal이다. 

ex) rect(t), tri(t), sinc(t)...

 

o Power Signal

energy signal과 반대로 signal energy가 infinte하면 Power Signal이라고 한다.

우리가 다루는 Power Signal은 대부분 periodic signal이 될 것이다.

 

Power Signal의 스펙트럼을 분석하기 위해선 Dirac delta function에 대해 알아야 된다.

 

 

o Dirac Delta Function

t=0을 제외한 모든 구간에서는 value가 0이고 t=0에서의 value는 무한히 크다.

델타 함수를 적분하면 1이 된다.

 

delta함수의 성질에 대해 알아보자.

 

1. Sifting(Sampling) 

Shift와 헷갈릴 수 있는데 전혀 다른 개념이다. sift는 sampling과 같은 개념으로 이해할 수 있다.

즉, f(t)와 delta(t-to)의 곱을 적분하면 to에서의 합수값이다.

 

2. Replication 

g(t)와 delta(t)를 *(convolution)하면 g(t)가 나온다.

 

3. Equivaence

델타함수는 t=a에서만 값이 존재하기 때문에, t=a에서의 값f(a)로 대체할 수 있다.

 

 

 

o Fourier Transform of Complex Exponential Function

Analysis equation으로 delta function의 푸리에변환을 나타내면 위와 같다.

위에서 언급한 sifting property를 적용하면 delta funtion의 Fourier Transform은 1이라는 것을 알 수 있다.

 

이를 기하학적으로 표현하면 다음과 같다.

 

따라서 

 

 

duality property를 적용하면 1의 푸리에변환이 delta function이 된다.

 

또한 Frequency Shifting property를 적용하면 complex exponential function의 푸리에 변환도 delta function의 shifted version으로 나타낼 수 있다.

 

 

이를 이용하여 Sinusoidal functions도 푸리에변환을 할 수 있다.

 

 

o Signum Function

이전에 다음과 위와 같은 함수 g(t)를 푸리에변환하면 G(f)가 나온다는 것을 알아본 적이 있다.

g(t)에서 a를 lim a->0으로 보내면 sgn(t)가 된다. 따라서 G(f)에서 a를 lim a->0으로 보내면 sgn(t)의 푸리에변환을 구할 수 있다.

 

 

 

o Unit Step Function

 

sgn(t)의 푸리에변환을 구했으니 delta function을 이용하여 u(t)의 푸리에변환 또한 구할 수 있다.

 

 

 

o Fourier Transform of "Integration in Time Domain"

 

신호를 t까지 적분 한 값은 신호와 Unit Step Function의 곱을 적분한 값과 같다. 

이를 기하학적으로 해석하면 이해할 수 있다.

 

이는 g(t)와 u(t)의 convolution으로 나타낼 수있고, convolution property를 적용하면 y(t)의 푸리에변환도 알 수 있다.

이 식에 equivalence property를 적용한다.

 

따라서 적분 한 결과 아래와 같다.

 

저번에 다룬 fourier transform property중 Integration in the time domain과 비교를 해보자.

이는 G(0)=0 일떄만 성립을 한다. G(0)을 DC성분(Discrete current component)이라 하며 DC성분이 0인 경우는 g(t)의 시간에 대한 평균값이 0인 경우이다. 정현파가 예이다. 또한 고주파성분만 있는 경우도 DC성분이 0이된다.

 

 

 

o Fourier Transform of Periodic Signal

 

g(t)는 주기 신호인 g_To(t)의 한 주기 부분이다. g(t)를 수식으로 나타내면 아래와 같다.

g(t)가 g_To(t)의 한 주기만을 나타내고, 나머지 부분은 0이라는 뜻이다.

g_To(t)는 g(t)를 기본 주기(fundamental period) To의 정수배 만큼 이동시킨 신호드들의 합이다.

수식으로 나타내면 아래와 같다.

이 식을 푸리에급수(fourier series)를 통해 나타낼 수 있다. 먼저 푸리에급수의 계수 cn은 다음과 같다. 푸리에급수는 주기 신호를 다양한 주파수의 sinusoidal 함수의 합으로 표현할 때 사용된다. 

이 적분은 g(t)의 각 주파수 성분의 크기와 위상을 구하는 것이다. 또헌 cn은 g(t)의 푸리에변환인 G(f)를 통해서도 표현할 수 있다.

 

주기함수를 푸리에급수를 통해 표현하면 아래와 같다.

이 식을 푸리에변환에 적용해보고 델타함수로 나타내면 아래의 식이 나온다.

 

즉, 주기함수의 푸리에 변환은 한 주기 g(t)의 푸리에 변환 G(f)에 델타함수를 f0간격으로 올려놓고 그 위치에서의 spectrum value와 f0를 곱한 함수로 나타내진다. 

 

ex) Ideal Sampling function(Impulse Train function)

g(t) = ɗ(t)는 시간영역에서의 임펄스 함수다. 이 함수의 푸리에변환은 G(f) = 1 이다. 아래의 그림과 같은 Impulse Traind을 수학적으로 표현해보자.

 

이 함수를 푸리에변환을 해보자. 위에서 구한 식에 대입하면 아래와같은 G(f)를 구할 수 있다.

그리고 delta function의 equivalence property를 적용하면 최종적으로 다음과 같은 변환식이 나온다.

 

 

이렇게 델타함수의 푸리에변환은 상수값이므로 만약에 periodic function을 delta train으로 나타낸다면 그 푸리에변환은 더 쉽게 계산할 수 있을 것이다. 

 

g(t)=rect인 periodic function의 푸리에변환을 두가지 방법으로 구해보자.

sol1)을 보면 먼저 한주기 함수 g(t)=rect(t)의 푸리에변환 G(f)=sinc(f)를 구한 후, spectrum을 주파수가 f0인 델타함수와 f0, spectrum value의 곱을 통해 나타냈다. 하지만 sol2)의 경우 처음의 주기함수를 rect(t)와 주기가 T0인 delta train의 convolution을 통해 나타낸 후 전에 구한 delta train의 푸리에변환을 통해 구했다. 두 방법의 결과가 같은 것을 알 수 있다.

 

즉, 주기함수의 푸리에변환은 그 주기함수를 delta train function의 convolution으로 나타낸 후 delta function의 푸리에변환과 convolution property를 사용하여 쉽게 구할 수 있다. 

 

 

<요약>

주기 신호의 푸리에 변환은 연속 스펙트럼 G(f)를 "이산화"하는 과정이다. 델타함수는 f축에서 f=nf0(n은 정수)위치에 이산적인 성분을 나타낸다. 델타함수의 간격은 fundamental period(기본 주기)의 역수인 f0가 된다. 델타함수의 크기는 f0​×G(nf0​)로 조정된다.

 

위의 ex) 처럼 주기:T0인 사각파의 푸리에 변환은 f0×sinc(nf0) 크기의 델타 함수들이  간격으로 배열된다.

Electronic Circuits과목에서는 상용 전자 장치/기기에서 사용되는 전자/직접회로의 기초가 되는 기본적인 전자회로를 소개하고 해석하는 방법에 대해 다룬다.

회로를 정확히 이해하고 해석하기 위해서는 반도체를 기반으로 하는 개별 전자 소자의 특성을 우선 이해해야 한다. 반도체의 기본적인 물리적 특징에 대해 알아보자.


Transport of carriers - Drift

 

반도체 내에서 전하 캐리어의 이동 방법에는 크게 두 가지가 있다. 먼저 드리프트(Drift)현상에 대해 알아보자.

 

반도체에 전기장이 걸리면, 전하 캐리어가 가속되며 결정 내의 원자들과 충돌하면서 결국 다른 쪽 끝으로 이동하게 된다. 이렇게 자기장에 의해 전하 캐리어가 이동하는 현상을 트리프트현상 이라고 한다.

 

o velocity of carriers

전기장에 의해 캐리어는 가속을 받지만, 결정 내의 원자들과 충돌하면서 일정한 속도에 도달하게 되고 이를 "드리프트 속도"라고 한다.

캐리어의 속도 v는 전기장의 세기 E와 mobilyty(이동도)의 곱으로 나타낸다. 전기장의 세기와 속도가 비례함을 알 수 있다.

 

전자의 속도를 살펴보자. 실리콘에서 전자의 이동도는 1350cm^2/Vs이다. 전자는 전기장과 반대로 이동하기때문에 음의 부호가 곱해진다.

 

홀(정공)의 이동도는 실리콘에서 480cm^2/Vs이고, 홀은 전자와 반대로 이동한다. 홀의 속도는 아래와 같이 나타낸다.

 

캐리어의 속도는 전기장의 세기에 비례하고, 이동도에 의해 결정된다. 실리콘의 경우를 보면 전자의 이동도가 홀의 이동도보다 약 3배정도 큰 것을 알 수 있다. 

 

 

o drift current

전자 한개의 전하량은 q = 1.6x10^(-19)의 음전하를 갖고, 홀은 같은 크기의 양전하를 갖는다. 

 

아래의 그림은 전압 V1이 걸려있는 반도체를 t=t1과 t=t1+1에 관측한 모습이다. 즉, 1초동안 v미터의 길이의 바를 통과하는 총 전하량이 전류와 같다. v미터 길이의 바에 포함된 총 전하량은 다음과 같이 표현할 수 있다. (n:전자의 밀도, q:전자의 전하량)

전류를 계산할 떄는 1초동안 측정 단면을 통과하는 전하량을 고려하면 된다. 전류는 전하 캐리어의 속도와 밀도, 그리고 전하량에 의해 결정된다. 

 

o current density

"전류 밀도(Jn)"는 단위 면적을 통과하는 전류를 의미한다. 이는 다음과 같이 계산할 수 있다.

( μn:전자의 이동도, E:전기장, n:전자의 밀도, q:전자의 전하량)

 

전자와 홀이 모두 존재할 때, 총 전류 밀도(Jtot)는 다음과 같이 계산된다. (p:홀의 밀도)

 

전류 밀도는 전자와 홀의 이동도와 밀도에 의해 결정된다. 전자와 홀이 모두 존재할 경우 총 전류 밀도는 각각의 전류 밀도를 합한 값이다. 

 

Transport of carriers - Diffusion

캐리어(전자 또는 정공)가 농도 기울기(concentration gradient) 때문에 움직이는 현상이다. 반도체 내부의 불균일한 도핑으로 인해 외부의 전압이 없이도 발생한다는 차이점이 있다. 그림처럼 캐리어를 지속적으로 주입하면 농도차이가 유지되면서 확산 전류(diffusion current)가 흐른다. 

 

o Diffusion Current(확산 전류)

캐리어의 농도 기울기에 의해 발생하는 전류이다. 기울기는 dn/dx로 나타낼 수 있으므로, 전자의 농도에 비례한다.

환산 전류에 대한 공식을 나타낸 것이다. (A:반도체 단면적, q:캐리어 전하량, Dn:전자의 확산 계수)

실리콘에서 확산 계수는 전자의 경우 Dn = 34cm^2, 정공의경우 Dp = 12cm^2으로 전자의 경우가 3배정도 더 크다. 확산 계수(D)가 크다는 것은 캐리어의 확산 속도가 더 빠르다는 것이다. 즉, 전자가 정공보다 빠르게 확산된다. 

 

전자와 정공의 전류 밀도는 위와 같으므로 두 값을 더하면 총 전류 밀도를 구할 수 있다. 정공은 전자와 반대 방향으로 이동하므로 음의 부호를 갖는다.

 

o Einstein Relation(아인슈타인 관계식)

이는 반도체에서 확산계수(D)와 이동도(μ) 사이의 관계를 설명하는 식이다. 확산(농도 차이)과 드리프트(전기장) 현상이 평형 상태에서 서로 보상됨을 나타내는 것이다. (D:확산 계수, μ:이동도, k:볼츠만 상수, T절대 온도, q: 전하량)

 

이 관계식의 물리적 의미를 살펴보자. 먼저 평형 상태에서 반도체 내에서의 순 전류는 0아 된다. 확산 전류와 드리프트 전류가 크기는 같고 방향은 반대여야 한다.

Thermal Voltage(열전압) : 실온(T=300K)에서 kT/q=26mV이다. 이는 반도체 소작의 동작 분석에 자주 등장하는 매우 중요한 수치이다.

 

 

 

pn Junction

pn접합은 말 그대로 p형 반도체와 n형 반도체의 접합이다. P형 측(Anode, 양극)은 정공(p)이 다수 캐리어고, 반대로 N형 측(Cathode, 음극)은 전자(n)가 다수 캐리어다.

 

Deplection Region(공핍층) 형성 

P형과 N형을 접합하면 전자-정공이 확산하여 

 

 

o PN Junction Equiliburium(평형 상태의 PN접합)

 

외부 연결이 없는 즉, 전압이 인가되지 않은 개방상태의 PN접합을 평형에 있다고 한다. 이떄의 전류는 0이고 내부 전기장(E)과 캐리어 농도 분포가 시간에 따라 변하지 않는다. p형의 다수캐리어는 정공이지만 소수캐리어인 전자도 소량 존재하며 np=ni^2을 만족한다.

 

Diffusion :

전자는 N->P 농도 기울기에 따라 이동한다.

정공은 P->N 농도 기울기에 따라 이동한다. 이 결과 확산 전류가 발생한다.

 

Drift :

확산으로 인해 P형 측은 음(-) 이온, N형 측은 양(+)이온이 노출되며 내부 자기장(E)이 형성된다. 이 전기장이 캐리어를 반대 방향으로 이동시켜 드리프트 전류가 발생된다.

 

따라서 "환산 전류 + 드리프트 전류 = 0" 이 평형 조건이 된다. 

 

 

 

 

o pn접합의 공핍층(Depletion Region) 형성 과정

 

공핍층은 pn접합 경계 근처에 자유 캐리어(전자, 정공)가 거의 없는 영역이다.

경계면의 원자들이 이온화되어 공간 전하가 형성되어 내부 전기장을 생성한다.

 

t = 0) p형과 n형 반도체가 물리적으로 접합되면, n형의 다수캐리어인 전자와 p혀으이 정공이 접합면으로 확산하기 시작한다.

 

 t = t1) p형의 접합면에 전자가 많아져 원자들이 음이온화가 된다. 반대로 n형의 접합면에는 양이온이 노출된다. 접합면 근처에 이온만 남은 영역(공핍층)이 점점 넓어진다.

 

t = ... ) 확산으로 인한 전하 이동이 내부 전기장을 강화시켜, 드리프트 전류가 확산 전류를 상홰한다. 더 이상 순 전하 이동이 없어지며 공핍층의 너비가 고정된다. 평형상태에 도달한다.

 

 

o pn접합의 Built-in Potnetial(내장 전위)

 

내장 전위는 pn 접합의 평형 상태에서 공핍층에 형성된 자발적 전위차로, 캐리어 확산을 정확히 상쇄하는 역할을 한다. 실리콘에서 내장 전위는 약 0.7V(300K) 정도 된다. 내장 전위의 방향은 N->P로 p형으로 이동하려는 전자를 차단한다.

 

pn접합에서 내장 전위는 아래와 같이 나타낼 수 있다.

(N_A: P형 도핑 농도(억셉터), N_D: N형 도핑 농도(도너), ni: 진성 캐리어 농도(실리콘 : 1.08 x 10^10(300K)), kT/q: 열전압(300K에서 약 26mV) )

 

주어진 조건으로 실리콘의 내장 전위를 구해보면 약 768mV가 나온다. 

 

이러한 내장 전위로 인해 순방향 바이어스가 걸릴 때 인가된 전압이 Vo보다 커야 전류가 흐르며, 역방향 바이어스 일 땐 공핍층이 확장되며 전류가 차단된다. 

 

 

o Recerse Bias(역방향 바이어스)

N형에 (+), P형에 (-)전압이 인가되면, 내장 전위(Vo)를 강화시켜 캐리어 이동을 억제한다. 

-> 따라서 역방향 바이어스가 커지면 공핍층이 넓어져 커패시터 처럼 동작한다.

 

o Forward Bias(순방향 바이어스)

P형에 (+), N형에 (-) 전압을 인가하여 전류가 흐를 수 있게 한다. 전류가 흐름에 따라 소수 캐리어의 농도가 증가하게 된다. 

다이오드에서 전류와 전압간의 관계를 식으로 나타내면 아래와 같다. 

(V_D는 다이오드의 전압이고 V_T는 열전압이다. (약 26mV), Is는 역방향 포화전류 상수이다.) 

따라서 전류와 전압간의 관계는 선형적이지 않고 지수함수적 관계를 갖는다. 

순방향 바이어스 : 전류가 지수적으로 증가하고, Vd가 Vo을 넘어가면 급격하게 증가하는 것을 알 수 있다.

역방향 바이어스 : 전류를 차단한다. 

수식에서 근사화를 통해 '-1'을 생략할 수 있다. 

 

또한 pn접합으 흐르는 전류는 소자의 단면적에 비례한다. 따라서 단면적이 A인 pn접합 두개를 병렬 연결하면, 단면적이 2A인 pn접합과 같은 전류가 흐른다. 

 

 

o Constant-Voltage Model(정전압 모델)

이러한 비선형적 특성 때문에 회로 해석이 복잡해 진다. 순방향 전압을 고정값 V_D,on으로 근사화 한 것을 정전압 모델이라고 한다. 실리콘의 경우 이전에 계산 한 것 처럼 약 700~800mv이다. 

 

순방향전압이 걸릴 때 다이오드를 스위치가 닫힌 0.8V전압원 으로 보는 것이다. 그리고 역방향 전압이 걸리면 그냥 스위치가 open된 상태로 본다. 

 

 

+ Recent posts