2014年11月25日 星期二

Skype Web URI Test



Call the Skype Echo / Sound Test Service




2014年9月30日 星期二

Acoustic Echo Canceler (迴聲消除)

前陣子為了處理音質有關的問題,開始感到扼腕...以前念書時應該修些訊號處理相關的課程...

在實做VoIP的同時,迴聲一般發生在手機聽筒播出的聲音同時又被手機麥克風收錄進去,這樣會造成發話方會聽見自己說出的話,這種是最常見的迴聲;(還有另一種迴聲是透過環境的反射而重複收錄進去的迴聲。) 雖說雖然看了一些文章... 但要實作出一個可靠的消迴聲機制... 似乎又是另外一回事了。

好在之前在研究OPUS(Free Audio Codec)的語音編碼相關使用方式的時候,就有看到底下這句:

Does Opus have an echo canceller like Speex does?

Echo cancellation is completely independent from codecs. You can use any echo canceller (including the one from libspeexdsp) along with Opus. That being said, among the free acoustic echo cancelers (AEC) we're aware of, the best is probably the Google AEC from the WebRTC codebase.


Google提供的 WebRTC 裡面的 AEC 確實時值得一試,感覺越來越依靠google了 Orz
附帶一提 WebRTC 裡的 AEC 還提供了特別給 Mobile 使用的版本:  AECM (AEC for Mobile)

要使用 AECM來幫忙消除回聲 主要透過 echo_control_mobile.c 裡的兩個函式: WebRtcAecm_BufferFarend 及 WebRtcAecm_Process


  • WebRtcAecm_BufferFarend(void *aecmInst, const int16_t *farend, int16_t nrOfSamples)
    • 這裡的 farend 需要傳入的是遠端傳來的語音資料,也就是將要從聽筒被播放出來的聲音。

  • WebRtcAecm_Process(void *aecmInst, const int16_t *nearendNoisy, const int16_t *nearendClean, int16_t *out, int16_t nrOfSamples, int16_t msInSndCardBuf)
    • 這裡的 nearendNoisy 要放入的便是從麥克風所收錄到的聲音
    • nearendClean 則是可以放入經過 Noise Reduction (除躁過後的資料)
    • msInSndCarBuf 這個值則是需要特別計算才能夠取得良好的回音消除效果,回音的消除是需要將聽筒播出的聲音及麥克風錄到的聲音做一個相對精準的計算來給定這個值,才能讓AECM達到良好的效果。


來看看實驗結果:

底下這個波形所錄到的聲音是將VoIP時的,受話端聽筒音量調到最大,讓聲音盡可能地被受話端又重複收錄所造成的迴聲:

下面這個波形是重複上面的動作,但同時我們將AECM的功能打開來看看迴聲消除的效果:





實際上的效果確實還不錯!

不過實際在使用的情況,不同的人聲、各式各樣的背景聲,有時候得到的迴聲消除效果似乎也還沒到特別滿意的地步,尤其當播出的音量特大時,依然能聽到清楚的迴聲...。看來這就是人蔘阿 還有很多事要改 Orz...


2014年3月14日 星期五

Visual Studio Online (Team Foundation Service)

如果本身在進行一些小團隊(小於5人免錢)的專案開發,個人覺得 Visual Studio Online (formerly Team Foundation Service) 還蠻適合作為一個不錯的工具。

從去年年底開始,試用了一段時間,還蠻不錯用的,如果是習慣用 Visual Studio 或 Eclispe 開發都可以拿來使用,基本功能不外乎版本控制(像是git的功能),專案管理(agile, sprint..) 之類的功能。

有興趣的可以參考底下的介紹:
http://blogs.msdn.com/b/somasegar/archive/2013/11/13/visual-studio-2013-launch-announcing-visual-studio-online.aspx
Visual Studio Online is made up of many services, including the following:
  • Hosted Source Control
  • Work Items and Agile Planning
  • Hosted Build Service
  • Elastic Load Test Service
  • Application Insights
  •  “Monaco”



2013年5月2日 星期四

Eclipse Modeling Projects

講到 modeling,這是一個抽象的東西。不過我想 Unified Modeling Language (UML),應該有不少人都聽過才對。而 Model Driven Architecture (MDA) 聽過的人可能就少了點...

以 UML 的 Class Diagram (類別圖) 來說,可能有些人有玩過。當我們設計了一個如下的簡單的類別圖:
我們是否能將上面的類別圖直接轉換成程式碼?答案是肯定的,印象中現在已經有不少工具是可以將 UML 建構出來的 MODEL直接轉換成可執行的程式碼,微軟的VISUAL STUDIO 似乎也有一套這樣的工具,而 ECLIPSE 也當然有這樣的東西。

ECLIPSE 具相當多的 Modeling Projects 而且還是OPEN SOURCE, 如: Eclipse Modeling Framework (EMF), Graphic Modeling Projects (GMP), Textual Modeling Framework (TMF) ... etc.

當我們在解決各式各樣的問題的時後,有些時後我們可能會定義一些自己的 model來幫忙自解決問題。而我們自己定義的這些 model 是不是一樣可以跟 UML 一樣轉換成我們要的程式碼?答案也是肯定的。透過ECLIPSE 的Modeling Projects,我們可以很輕鬆的做到這件事。

以底下的範例來說:
筆者自己定義了幾個 pattern , , 想要來協助撰寫 dual core (mpu+dsp)的程式,然後將這些定義好的 pattern model在轉換成對應的程式碼。我們就可以用eclipse本身所提供的一堆 modeling tools/projects 來做到這件事。



上圖的範列就不多做解釋,因為不是本篇重點,而且那只是筆者曾經小小的論文的一部份。

不過 ECLIPSE對筆者來說,確實是一個知識的寶庫,可以直接跟著有十幾年軟體經驗的人學習,再來後續的幾篇會來整理有關 EMF, GEF, GMF 的介紹。

2013年4月28日 星期日

Master Boot Record (MBR) Bootkit

Master Boot Record (MBR),中文又叫做 主開機紀錄 或 主引導磁區,MBR位於電腦硬碟最起始的SECTOR。
MBR 可說是電腦在開機的時後不可或缺的一環,當電腦按下 POWER 鍵,BIOS做完POST (Power-On Self Test),接著便會將 MBR 載入到記憶體 0000:7C00,然後將CPU執行的控制權交給 MBR 這段程式碼。

一般來說,MBR所記載的開機程式碼,都是固定的。 如下圖所示 Windows XP MBR sample:
(圖片的來源取自於: http://thestarman.pcministry.com/asm/mbr/Win2kmbr.htm ,跟著大師學習)




而 MBR 的程式碼的部份 (0000-012B),主要是讀取Partition Table (ps: partition table裡記錄的就是硬碟裡的分割磁區,假設一顆硬碟裡有兩個分割槽: C槽跟 D槽,那麼 partition table 裡面就會有這兩筆 record)裡的 Active Partition (0x80),以上圖來說 01BE 的 80 便是ACTIVE的 PARTITION,而ACTIVE的 PARTITION 會指到對應的可開機的BOOT PARTITION,一般來說就是 WINDOWS OS 的BOOTLOADER 安裝所在,而假使 MBR 找不到對應的開機磁區,這時電腦螢幕便會看到藍紫色裡的ERROR MESSAGE (ex: Missing operation system.)。(PARTITION TABLE跟後續的WINDOWS OS的BOOTLOADER 這邊就簡單帶過,不是本篇的重點)

而所謂的 MBR BOOTKIT ,便是會將自己的惡意程式塞入MBR裡,藉由MBR開機的時後便執行起來,以往比較常見的BOOTKIT都是直接代換掉MBR 原先的 CODE 部份,換成自己的惡意程式。不過最近倒是遇到了一些更機車的變種,是修改USER的PARTITION TABLE,一般來說partition table 只要壞了,那麼那顆硬碟也就廢了,電腦不會認得裡面的資料。

底下的圖,是改自 自己電腦的一個sample,其中 MBR BOOTKIT是將自己的CODE 放在硬碟的第 52 (0x34) SECTOR 裡:

之前有段時間因為一直收不到sample,造成 rescue disk detect 不到,而無法清除的窘境... (荼)。

2013年4月27日 星期六

Linux Hardware Detection

在玩 Rescue Disk 的時後,當初遇到最頭痛的問題是 hardware 問題。

比方說 我有一台電腦的 硬碟 Linux 根本 MOUNT 不起來。
這時後理想的情況是找出 LINUX 跟 HARDWARE 的關係,讓LINUX也能認得那顆硬碟。

目前手邊知道的方式有兩個:

  • 其中一個是用 Hardware Detection Tool (HDT): Link

    這個 tool 一直到近幾個月都有在更新,可靠度應該也是不錯的。玩open source有趣的一個地方,是像這樣看到一堆人再做各式各樣的東西。

    底下的這張圖,是我用 vmware 截取下來的,它可以很清楚的列出這台機器的硬體所需要Linux Kernel Module的支援 (ata_piix, i2c_piix4 ... etc)。



  • 另一個方式,是用 COMMAND LINE 下指令取得資料。

    雖然我本身不太玩HARDWARE的東西...,不過一般來說 PCI 扮演著主機板跟HARDWARE DEVICE間接連的重要角色。而 LINUX 也提供 "lspci" - list all pci device 這個有用的指令。而 "lspci -k" , -k 這個參數 是可以附帶列出 Linux 對應的 kernel driver/module。

    如底下這張圖所示:



    另外 lsmod, lsusb ... 似乎也都是些有用的指令。


而在硬碟找到對應的 Linux Kernel Module,進一步可以在製作 LINUX KERNEL時,決定要不要將對應的 KERNEL Module/Driver 放入製作的 LINUX KERNEL。
底下的圖,是在編譯LINUX KERNEL前的 make menuconfig:


不過要真的快又正確的的找到所需的 LINUX KERNEL MODULE跟DRIVER,大概還是需要相當的經驗 Orz... 

2013年3月31日 星期日

PXE: boot from network

最近在研究一個叫 Preboot Execution Environment (PXE) 的東西。
而這是一個什麼東西,簡單來說就是可以讓一台電腦不需要硬碟,就可以從網路端做開機的動作。
透過網卡下載開機所需的檔案、目前可以做到下面幾件事 (當然應該還有很多可能的應用):

  1. 開機進到一個OS
  2. 從網路端來透過大量部屬OS的動作
  3. Network boot into RESCUE DISK。


先從 SLACKWARE (Linux 的一個分支) 講起,網路上已經有詳細的文章教大家如何透過網路來部屬 SLACKWARE LINUX: PXE: Installing Slackware over the network從這篇文章,可以知道要做到 PXE BOOT,需要設定一台 PXE Server 包含這些 BOOTP/DHCP/TFTP/NFS services、需要client端的網卡具有 pxe 的功能。

其中架設 dhcp 及 tftp server 可以透過 dnsmasq 這隻程式就能做到:

dnsmasq --enable-tftp --tftp-root=/tftpboot \
--dhcp-boot=/slackware-12.1/pxelinux.0,"192.168.0.1",192.168.0.1


tftp-root: ftp 端提供開機所需的 LINUX KERNEL      
pxelinux.0: 從 network boot 所需的 boot loader

而 NFS (network file system) 的架設 同時可以用其他的 HTTP SERVER 來代替,而這個SERVER 端所需的檔案為 OS 安裝所需的檔案。

以上的那些複雜的設定,其實已經不需要自己手動的一個個設定了,在 SLACKWARE 13.37版的 RELEASE,已經提供了一個簡單的文字介面,來做快速設定,可參考這篇文章:  Out of the box PXE install server in Slackware 13.37.

SLAX 也提供了 PXE 這樣的功能,只需要將一台電腦跑起來成為 SLAX PXE SERVER,再來從同一個網段的 CLIENT端,只需要透過網卡做開機,就可以執行一台具有 SLAX 的電腦。
(PORTEUS 另一個 OS 選擇也具有 PXE 這樣的功能)
有興趣的人可以研究一下 SLAX底下的 /sbin/pxe 這個script檔,底下為這個script裡的片段程式碼。其實很簡單的就可以跑起一個 pxe server (不過要搞清楚這些設定,其實也是需要相當的底子 Orz 像我就花了不少時間來研究):

底下附上,網路端開機的幾張照片:


講了這麼多,RESCUE DISK透過一些修改也是可以做到從 NETWORK BOOT  XD