10.31.2007

UnxUtils : Unix shell tools for Win32

Windows Command Windows 的工具實在太少了,用起來也不習慣。
對於常常切換 windows, linux的人,沒有(或是名子不一樣) less, grep, ls, vi 實在很麻煩。
動不動就要切換window,用mouse 開啟file。

但是光是為了這個原因而裝Cygwin 也顯得太麻煩。

這個 package 就是為了這個而做出來的: UnxUtils

奇怪我找不到安裝說明,所以就把他解開到 C:\UnxUtils\usr\local\wbin ,然後把他加到path 中,就可以用了。

這個package 把source code重新用msvclib link,所以不必用到cygwin 的dll。

裝mercurial的人應該要裝這個

10.26.2007

USB plug-in Interrupt Sequence

以下資料都是參考(Copy)自"USB Made Simple" http://www.usbmadesimple.co.uk 網站內容:


USB又有問題,所以再來複習一下 ISP1582 的 plug-in interrupt sequence...
  1. Get VBUS Interrupt
    1. Reset Controller
    2. Unlock Controller
    3. Set bit "bmSoftCt" == 之後若是pause的話,pc 會出現 "USB 裝置無法辨識"。
    4. Enable Interrupt
  2. 因為reset controller,所以會再出現一次 VBUS Interrupt
    1. Set bit "bmSoftCt"
  3. Get BUSReset "bmIBrst" Interrupt
    1. 設定好 endpoint register (low speed, double buffer, enable)
    2. Enable null address
    3. 啟動 power "bmPwrOn", Clock "bmClkaon"
  4. Get High-Speed Interrupt
    1. 進入high speed,重新設定 endpoint (high speed, double buffer, enable)
  5. Get BUSReset "bmIBrst" Interrupt Again..
  6. Get High-Speed Interrupt Again..
  7. Get EP0Setup Interrupt

在 interrupt handler 中加上 log... interrupt 依次是 (第一次的VBUS不算)
  1. VBUS
  2. Brst (BUSRESET)
  3. HighSpeed
  4. EP0 Setup
  5. Brst (BUSRESET)
  6. HighSpeed
  7. EP0 Setup
  8. ... EP0 Setup...

這一篇 ( USB Made Simple ) 有說明 Device Plug-in 時的電器信號。

Host 看到的D+, D- 狀態:

Detached:
Host 沒有接任何device時。
  • D+ : 0
  • D- : 0
Attached (High, Full Speed device)

  • D+ : 1 -- 這個是Device 拉的,因為device的D+有接1.5k ohms 到 3.3V
  • D- : 0
由於這個狀態就是 device, host 相連後,雙方都沒動作的狀態,所以又叫 idle state

所以拿示波器量測 D+ (device端):
  1. D+, D- 都是GND
  2. D+ 3.3V , D- 0.0 : 這是 controller 送出 SoftCt - 將D+ 拉到High (之後就維持到High)
  3. D+ 3.3 V 維持約100ms 之後 D+ 到 0.0V : 這是 PC送出的 bus reset。
  4. D+ 0.0V 維持約10 ms後(ref)恢復到3.3V : controller 收到 Bus Reset interrupt。
  5. 之後 應該是連續的High/Low (高速交握)...(ref Negotiation High Speed)
USB Made Simple Part 6: High Speed Negotiation 有 一張波形圖:



這裡(討論區) 還有一個中文的有關 USB 啟動信號的說明。
-- 為防止討論區倒閉,我的google notes有一個備份 --

10.25.2007

痞子推薦的麵包店



住在附近的人一定要去喔。

參考這一頁 http://blog.pixnet.net/peace543/post/10149448

Configure VSS for internet access

這是英文的說明 (http://alinconstantin.homeip.net/webdocs/scc/vss_internet.htm)
這一頁(http://linwinfan.cnblogs.com/archive/2006/05/30/412912.html)是中文說明。

VSS Internet plugin 的傳輸效能較 LAN plugin 的效率來得高。適用於低傳輸環境。

Server :
  • ALINC-HOME
  • Internet : http://alinconstantin.dtdns.net
Work:
  • ALINC00
  • Domain : REDMOND

Server 和 Client(Work) 都要裝VSS。
Server
  • 選Custom Install -- Server Components (HTTP Remote Access component)
Client :
  • Default
  • 安裝完後,選 "VSS Internet plugin" 為 active source control provider
  • VSS2005 的user : Tools\Options -- SourceControl/Plug-in -- Option -- Microsoft Visual SourceSafe(Internet)"
  • 若是使用VSS2003 -- ioioioiooiosos


  1. Server : Create database,Open SSAdmin
  2. .....

雖然很多人說VSS對軟體開發不好,但是還是很多人喜歡用的呀....

10.19.2007

USB Signal Voltage

有關 USB 電器信號..


但是2.0 裝置插入時,會先用1.1的電壓,然後進入high-speed chip-chop ,然後reset,然後才用 2.0 的speed (電壓)

10.18.2007

Catch it!

結果是 Port B : 2
一設為High就 system reset.

在 Audio.cpp : SpeakerOn( )

猜測是 power drop.


感謝 multi-ice....

modify some codes..

需求:
  • Class source 加進來就可以用。
source filename 不同,但是class name相同,class interface 相同。

或是..

將interface 獨立宣告出來。各project 衍生出不同的實做。 client code 操作 interface介面。
  • 問題:client code與interface衍生class 的實體發生關聯的方法是 ?
    使用 pointer ? Robert作不喜歡 pointer
原因查出:
  • 因為Robert implement 的 startup code,沒有作ctor section 的初始化,所以不能用 new 運算原。
所以並不是不能用pointer,而是不能用 new..

所以.. 用一個parent class 的 pointer 指向 child class 的實體 object是允許的。
所以.. 所有global object 改用 interface class,在global header file 宣告 interface pointer。然後在 程式啟動時,將實際生成的class 指定給 global interface pointer,讓其他的client code使用。


分析目前code架構,決定修改方法:

在GlobalObjectInit( )中作initialize : 在 CEntry( ) 中 _cpp_initialize( )後就執行,可以確保在任和class operation 之前會作初始化。

就從修改 GlobalObject.h 開始,將global class variable 宣告為 pointer。
CUART  *g_CUART;
CUART3 c_CUART;
c_XX 是實體, g_XX 是interface。
真正的作法是:
static CUART3  c_UART;
CUART *g_CUART = (CUART*)&c_UART;
CUART 是 CUART3 的parent class。
這應該才是Robert 當初設計的目的(?)


從 Mini 開始改起..
  • 還不錯,改了一兩個project後,接下來的project 很好改。
    證明這樣的架構不會引入新的關聯性。
  • 從 Mini 架構 fork 新project 也很容易。
問題:
  • 有些 header file 會區分 是否為 "Mini" project ,而 include 不同的 header,造成在 mini 中要使用完整版的class 出現問題。
  • 上面的例子都是出現在 使用到 class中的static function。

CopyFunction To RAM, Load and Run

上一篇(http://realchecko.blogspot.com/2007/10/loadandrun-overwrite-running-program.html)要宣告 assembly 中的label 的宣告有點不好。
因為是code label,所以還是宣告成 function 比較好 (否則 compiler 會作取值運算)。

總結一下,就是:
extern "C" void CopyAndRun_Start(void);
extern "C" void CopyAndRun_End(void);




memcpy((int*)0x0400,(int*)CopyAndRun_Start,(unsigned int)CopyAndRun_End - (unsigned int)CopyAndRun_Start);

((void(*)(int,int,int))0x00000400)(0x33800000,(int)0x31000000,FileSize ());


這樣就可以了。

10.17.2007

LoadAndRun - Overwrite the running program

要作一個LoadAndRun功能..所以會遇到 Load 到目前program的區域,把自己蓋掉的情況。
所以要先Load到其他地方,copy回來,再run。 這樣,就可以把 "copy" 的動作。 放到其他地方,

要處理的部份,就剩下 "Copy" 的code。

漂亮的話是要用 RAM Function,修改loading script,讓init code把 "Copy" function 放到"其他區域"。

但是 這有點麻煩。--- 因為不確定 memory usage map,不知道要擺在哪好。
所以,想利用 SRAM的區域來放。
目前SRAM放 bootloader code,一旦boot 完,就沒用了。

但是要小心,因為前面的區域,有Exception Hanlder要用,所以要避開。

開啟 make option 的 map output,看一下,就從 main.c 所佔用的區域開使用好了。

main.o 從 0x00000368 開始。 那就從 0x00000400 開使用好了。

SRAM有4k,所以還有3k的space可以用。

原來想把 "CopyAndRun" function 實做在 bootloader中,然後用get function pointer 取得。讓 test code run,但是這樣太不flexible,bootloader改版時,testcode也會受到影響。
所以還是拿來當scratch memory來用好了。

test code把需要的code 填入 這塊區域,然後跳過去run。



CopyAndRun( )要寫到assembly code 中。因為 Run 的Launch 動作本來就是寫在assembly 中。


先寫一個code看一下argument order..

EXPORT CopyAndRun
CopyAndRun
mov pc,lr
然後在 source (*.cpp)中..
extern "C" void CopyAndRun(int a,int b, int c);
..
CopyAndRun(1,2,3);
build , set breakpoint on CopyAndRun 看一下r0,r1,r2的值...
依次是1,2,3,所以argument 的順序是 r0, r1, r2.. 其實這個看ABI 應該可以知道....




實做 copy function...
; void CopyAndRun(DWORD dest, DWORD src,DWORD length)
EXPORT CopyAndRun_Start
EXPORT CopyAndRun_End
CopyAndRun_Start
add r2,r2,r1 ; src+len = end
10 ldr r3,[r1]
str r3,[r0]
add r0,r0,#4
add r1,r1,#4
cmp r1,r2
bne %B10
mov pc,lr
CopyAndRun_End
開頭和最後的label是給copy用的。先作copy的部份,run 只要改最後 的instruction就可以。

這一段code,要被copy到 0x400 的位置,再呼叫。
C function 中,要宣告出 function 的 Start, Stop position ,然後在程式中使用前,用memcpy copy到0x400:
extern void *CopyAndRun_Start;
extern void *CopyAndRun_End;
....
memcpy((int*)0x400,(int*)&CopyAndRun_Start,(int)&CopyAndRun_End - (int)&CopyAndRun_Start);
....
((void(*)(int,int,int))0x0400)(0x500,(int)testdata,20*4);
上面的sample 把 testdata的內容copy到0x500的地方
這樣就可以 check 0x500 的memory內容是否真的和testdata一樣。

確認OK後,就可以改 CopyAndRun 的assembly code。作 Run 的動作..
; void CopyAndRun(DWORD dest, DWORD src,DWORD length)
EXPORT CopyAndRun_Start
EXPORT CopyAndRun_End
CopyAndRun_Start
mov r4,r0 ; save dest address
add r2,r2,r1 ; src+len = end
10 ldr r3,[r1]
str r3,[r0]
add r0,r0,#4
add r1,r1,#4
cmp r1,r2
bne %B10
; mov pc,lr
mov pc,r4 ; jump to dest addr

CopyAndRun_End

10.15.2007

好人的獎賞 ?

在這裡(http://blog.xuite.net/sinner66/blog/13740756)看到的..

大意是說..能夠當一個好人,已經是上帝最好的獎賞了,所以,上帝不需要再給好人其他的獎賞。


所以說,拿到好人卡的,應該就要知足了,別再去煩發卡給你的人 ... :P

10.10.2007

HUB 的選擇

上次買的:hub。

對於一般家用來說,hub實在沒什麼好選的,因為流量也不大,速度要求也不高,照理應該是雖變買一個都OK。

誰知道...



SMC 8 port switch hub.

踩到地雷...

他的特殊外型,不計較,反正hub也不會擺在顯眼的地方。
但是...


AC插座設計在這裡,就有大問題了..
插上AC adaptor 後,就有差不到底的感覺,然後...

Video: stupid design
因為那個圓弧,所以街頭的公差變得很critical :
而我買到的,公差大概大了一點..


雖然家用的hub沒什麼好挑剔,但是稍微一碰到,AC Adaptor就自動跳出來的功能,是絕對不需要的。

還好燦坤很有良心,讓我換了一個,但是我當場試插了一下,結果還是一樣。
所以,他們就很好心的讓我換一個品牌。

這次我不敢隨便拿了,就拿一個最普通的..正正方方,



有了前次經驗,檢查了一下...

嗯,perfect,整個socket頭都有露出在外。
這下就可以很穩固的插上了。

這件事讓我想到一個成語.....多XXX

水杯的考驗

這是我的水杯。
有看到,手柄下端,有一個用繫線帶繞起來的..



是要幹什麼用的呢 ?

阿基米德的繼父

本月買的書:


繼父是宮部美幸宮部美幸的作品,這一本是趣味溫馨走向的推理小說,蠻有趣的。

阿基米德這本應該屬於"科普"類。說明阿基米德的一本手抄本被發現並解開內容的過程,並且於內容得知阿基米德原來遠較我們以往的認知來得偉大得多。

宮部美幸這本,後面的推薦:


有發現什麼嗎? (這句是問同學的)
奇怪...,平常貼這些無聊東西的msn live space竟然不能貼了..
測試一下

上禮拜是Robert的婚禮。



喜帖打開是這樣...


我知道...攝影師很厲害...
看得出來Robert是我們所有同學中最年輕的,.....大概年輕我們10歲..


請客當天...


..Stanley當年(?) 的揮手動作....
還有,當天一整個下午,Robert都維持著這樣的笑容.. :)

10.09.2007

p.60 ..這可不像托運行送錯地址一樣,說聲抱歉就能了事...

newlib : undefined reference to 'end'

使用newlib,因為使用到vsprintf( ),所以 link 的時候出現
In function '_sbrk':
syscalls.c : undefined reference to 'end'
查一下,sbrk( )是syscall 用來作heap memory managemet 的function call,他會需要知道heap region的end address。
所以需要由linker 告知 heap end address (end).

所以修改ldscript,在heap end 處定義 mark 'end' :
 PRIVODE ( end = . ) ; 
但是要注意,要為heap留位置。

loading script中 ' . ' 的意思代表目前ram 的位址。
所以用..
 .  += 1000;
就可以將 目前ram位置向後移動 1000 byte (也就是空出1000 bytes)

small program for ... write program to nandflash

主要功能:讀取SD card的 file ,拆解燒到nandflash 中。
需要的component有:
  • SD card
  • FAT filesystem
  • Nandflash (Write)
  • UART
Steps
  1. Show messasge from UART
  2. Detect SD Card
  3. Read SD Card data
  4. Parse FAT structure
  5. Read File Name, find the File
  6. Read File
  7. Nandflash read sector
  8. Nandflash write sector
Ref : Robert's RoATP Code.

10.05.2007

dynamic_cast

C++ 的dynamic 是要配合RTTI 做的,他可以把class pointer cast 成他的derive class。
如果那個class 本身就是base class 的pointer,不是由derive class pointer cast 過來的,
dynamic_cast 就會 return NULL。

那...他怎麼知道他原來是那一個class pointer ?

所以要RTTI的支援呀!

#include <iostream>
using namespace std;

class A
{
public:
virtual void print() { cout << "A: print" << endl; };
};

class B : public A
{
public:
virtual void print() { cout << "B: print" << endl; };
};

void callprint(A* a)
{
a->print();
B * b = dynamic_cast<B*&t;(a);
if(b)
b->print();
else
cout << " callprint fail " << endl;
}

int main()
{
A* pa = new A;
B* pb = new B;

cout << "now pass A:";
callprint(pa);

cout << "now pass B:";
callprint(pb);

return 0;
}
大意是callprint 會將傳入的point cast 成 child class B。
於是main program 先傳A進去看看他會不會被騙,再傳B進去看看是不是OK.
結果是..
now pass A: A: print
callprint error!
now pass B: B: print
B: print

所以..用dynamic_cast< > 真的可以cast一個base class 到他的derive class喔。

10.04.2007

Orthogonal Function..

?Fourier Transform 的evalution 算法竟然是...
  1. 先假設 該signal = sum(every harmonic wave component)
  2. apply inversion function on both size.
  3. ++ and -- then** and ?? ..
  4. change index with n
  5. done!
其中,利用到 orthogonal 的特性:只有自乘會有值留下,其他相乘都會是 0...


照這樣的推演過程... 不是所有有orthogonal function 都可以用來作為組合的函數....

所以,偉大的應該是找到orthogonal function 的人...

找一下Wiki,看看orthogonal function 有哪些...

http://en.wikipedia.org/wiki/Orthogonal#Examples

log : openocd , download image and run

>load_image  "C:\Y_2443InitDRAM\test.elf" 0x000000
2816 byte written at address 0x000000
download 2816byte in 2s 671875us

>resume 0x000000 <== 這個就是從 0x00000000 開始run的意思
Target 0 resumed

> halt <== 只是需要test.elf的init dram 的code,所以隨時停掉都沒關係
target halted in ARM state due to debug request......

>mdw 0x30000000
0x30000000: 00000000 <== dram 的region 可以access了 :)

>load_image "C:\ATP\Release\ATP_5000.bin" 0x33800000 <= download program 到dram 裡...
146436 byte written at address 0x33800000
downloaded ...

>resume 0x33800000 <== OK,從download的位置開始run...

ADS and GNU AS

arm-elf-as,可以使用類似 C 的 include 語法。

所以將 ads 的assembly 轉成 arm-elf-as:
  • 把所有 GET xxxx 改為 #include "xxx"
  • EQU 改為 =
  • lable 都要加上 ":" 結尾
  • comment 符號 ";" 要改為 "@",或者用 和 C 一樣的 "//" 和 "/* */"
  • local lable 一樣要在"數字"後加":" 代表是label。
    assmbly code 由"%B110" 改為 "110b"
  • DATA, DCD 的section 要改為一般的 label: .word 的方式
  • if, else, 都要改用和 C一樣的#if #else...

Qt/WinCE Preview Release

Qt出WinCE 的版本了。

Qt for Windows CE Technology Preview Download

直接 連過去看比較快,但是還是稍稍摘錄一下:
  • Base on Qt4.3
  • 支援 CE 和 mobile 5.0, 6.0
  • 包含 Qt 4.3 API: QtCore, QtGUI, QtNetwork, QtSQL, QtSVG, QtScript, QtXML and Active Qt模組
  • 同時發佈開發工具 Qt Designer, Qt Linguist and Qt Assistant
  • qtmake 支援 Visual Studio 的vcprj 專案檔
  • Complete Qt/WinCE source code
現在preview 版是以"Preview Licence"發佈,將來一樣會有兩種License : Commerical 和GPL。

download link 在,, http://trolltech.com/developer/download/qt-wince-preview-commercial-4.3.2-vs2005.exe

10.03.2007

openocd + arm-elf-insight

OpenOCD 可以配合 gdb 和圖形介面的 insight 使用。
一樣,由 YAGARTO 下載 arm 的toolchain,安裝。 (eclipse 的安裝也有,但是實際用起來好像沒那麼好用)。

ref HowTo
follow instruction,download一個example 下來當template改比較快。

修改makefile.. 其實只有改 target 和LDSCRIPT
#######################################################################
#
# !!!! Do NOT edit this makefile with an editor which replace tabs by spaces !!!!
#
####################################################################
#
# On command line:
#
# make all = Create project
#
# make clean = Clean project files.
#
# To rebuild project do "make clean" and "make all".
#

###############################################################
# Start of default section
#

TRGT = arm-elf-
CC = $(TRGT)gcc
CP = $(TRGT)objcopy
AS = $(TRGT)gcc -x assembler-with-cpp
BIN = $(CP) -O ihex

MCU = arm920t

# List all default C defines here, like -D_DEBUG=1
DDEFS =

# List all default ASM defines here, like -D_DEBUG=1
DADEFS =

# List all default directories to look for include files here
DINCDIR =

# List the default directory to look for the libraries here
DLIBDIR =

# List all default libraries here
DLIBS =

#
# End of default section
############################################################################

#############################################################################
# Start of user section
#

# Define project name here
PROJECT = test

# Define linker script file here
LDSCRIPT= ./prj/ANS5000_ram.ld

# List all user C define here, like -D_DEBUG=1
UDEFS =

# Define ASM defines here
UADEFS =

# List C source files here
SRC = ./src/main.c

# List ASM source files here
ASRC = ./src/crt.s

# List all user directories here
UINCDIR = ./inc

# List the user directory to look for the libraries here
ULIBDIR =

# List all user libraries here
ULIBS =

# Define optimisation level here
OPT = -O0

#
# End of user defines
################################################################################


INCDIR = $(patsubst %,-I%,$(DINCDIR) $(UINCDIR))
LIBDIR = $(patsubst %,-L%,$(DLIBDIR) $(ULIBDIR))
DEFS = $(DDEFS) $(UDEFS)
ADEFS = $(DADEFS) $(UADEFS)
OBJS = $(ASRC:.s=.o) $(SRC:.c=.o)
LIBS = $(DLIBS) $(ULIBS)
MCFLAGS = -mcpu=$(MCU)

ASFLAGS = $(MCFLAGS) -g -gdwarf-2 -Wa,-amhls=$(<:.s=.lst) $(ADEFS) CPFLAGS = $(MCFLAGS) $(OPT) -gdwarf-2 -mthumb-interwork -fomit-frame-pointer -Wall -Wstrict-prototypes -fverbose-asm -Wa,-ahlms=$(<:.c=.lst) $(DEFS) LDFLAGS = $(MCFLAGS) -nostartfiles -T$(LDSCRIPT) -Wl,-Map=$(PROJECT).map,--cref,--no-warn-mismatch $(LIBDIR) # Generate dependency information CPFLAGS += -MD -MP -MF .dep/$(@F).d # # makefile rules # all: $(OBJS) $(PROJECT).elf $(PROJECT).hex %o : %c $(CC) -c $(CPFLAGS) -I . $(INCDIR) $< -o $@ %o : %s $(AS) -c $(ASFLAGS) $< -o $@ %elf: $(OBJS) $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@ %hex: %elf $(BIN) $< $@ clean: -rm -f $(OBJS) -rm -f $(PROJECT).elf -rm -f $(PROJECT).map -rm -f $(PROJECT).hex -rm -f $(SRC:.c=.c.bak) -rm -f $(SRC:.c=.lst) -rm -f $(ASRC:.s=.s.bak) -rm -f $(ASRC:.s=.lst) -rm -fR .dep # # Include the dependency files, should be the last of the makefile
# -include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)

# *** EOF ***
然後就是 loading script : ANS5000_ram.ld

就是改 ram 的start address:因為用stepingstone 用的nternal ram,所以起始是0, size只有4k
MEMORY
{
ram : org = 0x0000000, len = 4k
}


然後就是給gdb用的command file : ANS5000_ram.gdb,因為我們的jtag board沒有lay nTRST,所以reset command無效。所以是
target remote localhost:3333
monitor sleep 500
monitor poll
monitor soft_reset_halt
monitor arm7_9 sw_bkpts enable
break main
load
continue
這樣作好後,就可以開啟cmd,下make,把program build 好 (build成test.elf)。
然後 將 openocd啟動起來 (ref 上一篇)。

再follow 上面的 Howto,用修改的cmd file 啟動insight (gdb):
C:\UseYagarto>arm-elf-insight -x .\prj\ANS5000_ram.gdb test.elf
然後就看到

以上都是在windows下做的,因為上次看code發現我們的jtag board layout 和內建的 chameleon 一樣,所以可以用 YAGARTO 的windows binary,只是將config 改為
#daemon configuration
telnet_port 4444
gdb_port 3333

#interface
interface parport
parport_port 0x378
parport_cable chameleon
jtag_speed 8

#use combined on interfaces or targets that can't set TRST/SRST separately
reset_config trst_and_srst #srst_pulls_trst

#jtag scan chain
#format L IRC IRCM IDCODE (Length, IR Capture, IR Capture Mask, IDCODE)
jtag_device 4 0x1 0xf 0xe

#target configuration
daemon_startup attach
#target
target arm920t little reset_run 0 arm920t
#working_area 0 0x200000 0x4000 backup
run_and_halt_time 0 5000
就可以
"hell freezing over or pigs nesting in trees"

Flash Lite Release New version

Vincent的最愛 Flash Lite 推出第三版了 : Flash Lite 3 Delivers Video to Go
然後NTT DoCoMo 和Nokia 都說要使用。

這次的重點是支援FLV格式的播放。

在DrDobb以前的文章已經說明過Flash Lite 1.1,有關Flash 軟體的開發和使用,可以過去看看。


但是,又如何呢?當我們向客戶說明Flash Lite 的單機費用後。
這件事情,就像沒發生過....

10.02.2007

the "N" samples

當作FFT時,每次拿來處理的 N個 sample 的 N 決定的是什麼?

回去翻翻教科書,原來第一句話,就把 N 說得清清楚楚:
Consider a sequence x[n] that is periodic with period N so that x[n] = x[n+rN] for any integer value of r...
這就是Fourier Transform的assumption : 假設目前處理的資料是periodic with itself。

所以,不用考慮其他的部份,N的大小就決定了FFT後所得到的最低頻率(最大週期)。
(或是1/2吧,記得有 Cosine 轉換,是假設這N個sample mirror後再repleat)。



啊 在從這裡繼續下去...

頻域分析就是基於....

  1. 任何 週期波,都可以由他的所有諧波重組而成。
  2. 諧波 : 頻率為整數倍的波。
  3. 其中,倍數是1的諧波,就叫做該信號波的fundamental wave。
所以,頻率是 3kHz 的信號(例如說方波,三角波),可以分解為一連串 3kHz, 6kHz, 9kHz, 12kHz 的sine wave 。
真奇怪,被proxy block了,只能進來編輯,不能access..

Nokia Acquire Navteq

這一篇新聞 Nokia to Acquire Navteq for Cool $8.1B

繼TomTom買下Tele Altas,Nokia 也買下了圖資公司 Navteq,這也是Nokia 在去年買下Gate5這家導航軟體公司後,再次對Location Base Service的相關產業出手。

Nokia說這樣將有助於他們加速在新產品中提供Location Base Service,他們將整合internet information 與geospace information,藉由他們的平台,提供更快速,更準確的地理資訊服務內容給所有的使用者。

最近開始普遍起來的3D導航地圖,好像都是用Navteq的圖資喔。

10.01.2007

eVC: Cannot Add Function

問題: 加入button 後,無法作加入button event handler 的動作,出現"Cannot Add function"的dialog。

Aloha說,這是因為缺了browse data base的關係,嘗試開啟Class Wizard,他會要你產生browse data,選dialog source,產生後,重開eVC就可以了。