OpenCV C++頻率域相角減半,幅值不變

在複數座標系下,相角減半,幅值不變;畫圖如下:

 

由倍角公式:

cos^{2}\alpha = \frac{1+cos2\alpha }{2}

sin^{2}\alpha = \frac{1-cos2\alpha }{2}

令:D = \sqrt{r1^{2}+{i1^{2}}}

則     cos\alpha = \frac{r}{D}      sin\alpha = \frac{i}{D}      cos2\alpha = \frac{r1}{D}

 

所以 r = D*\sqrt{\frac{D+r1}{2D}}         i = D*\sqrt{\frac{D-r1}{2D}}     

 

代碼實現:

//將相角*0.5,幅值保持不變
void half_angel(Mat &complex_r, Mat &complex_i, Mat &dst)
{
    Mat temp[] = {Mat::zeros(complex_r.size(),CV_32FC1), Mat::zeros(complex_r.size(),CV_32FC1)};
    float realv=0.0,imaginv=0.0;
    for(int i=0;i<complex_r.cols;i++){
        for( int j = 0; j < complex_r.rows; j++ ){
            realv   = complex_r.at<float>(i,j);
            imaginv = complex_i.at<float>(i,j);
            float distance=sqrt(realv*realv+imaginv*imaginv);
            temp[0].at<float>(i,j) =distance*sqrt((distance+realv)/(2*distance));
            temp[1].at<float>(i,j) =distance*sqrt((distance-realv)/(2*distance));
        }
    }
    merge(temp, 2, dst);
}

 

 

效果如下:

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章