2010-07-26 85 views
0

我需要找到一些通用的C++庫,它可以獲得反向fft輸出(fftw_complex格式,即兩個雙精度)並將這些數據轉換爲像png這樣的圖像文件。我可以通過瀑布來獲得2d數據(並且使用10log10來獲取每個頻率分量的幅度),但是我不知道哪個圖像庫會起作用。從逆離散快速傅立葉變換到頻譜圖

我確實曾經使用過一個名爲zimage的舊程序,但它似乎不再可用。我在我的Ubuntu 9.10系統上沒有MATLAB(但我確實有Octave)

Octave可以生成瀑布圖像嗎?我也需要將頻譜圖轉換成wav聲音文件。

任何想法??

+0

我認爲你的術語有點困惑 - 頻譜圖是頻域圖,你可以使用正向FFT(而不是反向)的輸出。 – 2010-07-26 18:58:44

回答

2

要創建的最簡單圖像格式是PNM。您可以將其打印爲文本文件,然後使用大多數圖形程序進行轉換。這裏是從維基百科頁面的例子:

P2 24 7 15 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0 
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0 
0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0 
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0 
0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

保存在名爲「feep.pgm」文件,該文件的文本,你會明白我的意思。

http://en.wikipedia.org/wiki/Netpbm_format

你必須擴展您的10log10信息的像素值。

0

OpenCV是一個庫,可以處理各種其他格式的PNG文件。它應該在你的Ubuntu 9.10系統上使用apt get libcv-dev(從內存中,你可能要仔細檢查包名稱)隨時可用。

/* 
* compile with: 
* 
* g++ -Wall -ggdb -I. -I/usr/include/opencv -L /usr/lib -lm -lcv -lhighgui -lcvaux filename.cpp -o filename.out 
*/ 

#include <cv.h>  
#include <highgui.h> 

/* 
* Your image dimensions. 
*/ 
int width; 
int height; 

CvSize size = cvSize(width, height); 

/* 
* Create 3-channel image, unsigned 8-bit per channel. 
*/ 
IplImage *image = cvCreateImage(size, IPL_DEPTH_8U, 3); 

for (int i = 0; i < width; ++i) 
for (int j = 0; j < height; ++j) 
{ 
    unsigned int r; 
    unsigned int g; 
    unsigned int b; 

    /* 
    * Keep in mind that OpenCV stores things in BGR order. 
    */ 
    CvScalar bgr = cvScalar(b, g, r); 
    cvSet2D(image, i, j, bgr); 
} 

cvSaveImage("filename.png", image); 
cvReleaseImage(&image);