2013年6月17日 星期一

盍各言爾志?

蓮花詩人本月在太魯閣遊客中心辦書畫個展,如果到她的網誌上流覽,不難看出她對這次的展覽相當滿意。


雖然已步入耳順之年,詩人潛心字畫幾年下來,也累積許多不錯的作品;再加上透過不斷的精鍊,一步步邁向藝術更高的境界。然而在做晚輩的眼中,看到她追求的不單純是美感,也在嘗試攀越著人生另一座高峰。

星期五下班時,聽老闆分享這趟商務旅行的收穫... 也許是師出同門的關係,老闆似乎總把我當成小老弟般看待更勝於一位工程師。在陽台上,俯瞰著內湖大大小小的建築,他一邊抽著菸,一面描述著旅程中去了哪些地方、見了哪些人、獲得什麼情報、公司下一步該怎麼走,眼神堅定的望著未來。我明白,他正在做著一件他覺得很有趣、很有成就感的事情,而且清楚知道這就是他想要的。

月底一個朋友要結婚了,搶在喜宴之前,三五好友聚一聚,簡單吃個飯,也順便聊著各自的終生大事。有人是月底結婚,有人是年底結婚;有些人是家庭革命,有些人是小倆口決定就好;有些人是遠距離戀愛,有些人是希望婚後仍保有自由空間。聽著一個個不同的故事,卻同樣都是不斷努力著進階自己的人生。

季路有次問孔子如何侍奉鬼神,孔子回答:「未能事人,焉能事鬼?」;季路接著又問孔子死亡是怎麼一回事呢?

人生須臾,生老病死一下子就過去了;活著,總得有個理由... 為理想也好,是責任也罷,總得給自己一個理由,是吧?

論語中有段記載是孔子與學生們討論各自的志向。子路說:「願車馬、衣輕裘,與朋友共。敝之而無憾。」,顏淵則說:「願無伐善,無施勞。」最後子路孔子「願聞子之志」時,孔子回答道:「老者安之,朋友信之,少者懷之。」而這個志向在「禮運大同篇」闡釋更加明確:
大道之行也,天下為公。選賢與能,講信脩睦,故人不獨親其親,不獨子其子,使老有所終,壯有所用,幼有所長,矜寡孤獨廢疾者,皆有所養。男有分,女有歸。貨惡其棄於地也,不必藏於己;力惡其不出於身也,不必為己。是故謀閉而不興,盜竊亂賊而不作,故外戶而不閉,是謂大同。
這段描述曾經發生在周朝的美好年代,當時大道奉行,選賢與能,人民注重品德與才學;社會繁榮穩定,每個人都有自己安身立命之所,遠離恐懼。

「未知生,焉知死?」是孔子季路的回答。如果活著的時候都不能好好活著,又何必談論死亡?所以孔子終其一生,想到的、說出口的、做出來的,都是以一貫之;君子任重而道遠,死而後已。

問問自己的理想是什麼呢?自己是否有認真的生活過呢?載浮載沉了三十多年,仔細檢視自己的人生,說真的,我曾認為自己是幸福的:起碼有過不錯的工作和幸福的家庭。可惜那樣的時光並無法維持多久... 接著便陷入是非對錯的泥沼裡,然後在愛與復仇間掙扎著。

在德國徘徊的時候,我到了一個叫做Bonn的小城市,貝多芬的故居在此。我走在Bonn一條條簡單而樸素的街道,小鎮內大多是由石頭鋪成的道路,雜踏著來往旅者的足跡,刻劃歷史的洗練;整個城市以淺黃色系為延伸,兩排的建築不帶有多餘的線條,略帶冰冷的空氣,呼應著萊茵河的歲月悠悠。我喜歡這樣簡單卻將優雅內斂的品味!從建築到態度,從飲食到衣著,大多數的德國風格隱含著簡約的生活格調。

「射有似乎君子,失諸正鵠,反求諸其身。君子之道,辟如行遠必自邇,辟如登高必自卑。」當我想到中庸裡的一段話時,竟是意外發現自己如此喜歡簡約態度的當下。

也許是因為發現自己對於生活訴求是簡單的,想想與其繼續在負面情緒中顛倒夢想,倒不如勇往直前。這樣的體悟,讓我在訴訟的最後關頭選擇諒解,獨自重新譜著嶄新人生。然而不論提出告訴或是豁然諒解,都是艱難的決定;也許唯有離開當下的境,才能勘破因緣合和。


現在,簡單的看書,簡單的寫文章,聽著單純的好聲音,心無旁鶩的追求工作表現,享受兩人的獨處。


2013/06/13
O.T.

2013年6月2日 星期日

An Implementation of Channel Converter (from mono to stereo)

There is an experience about sharing how to make a converter between mono channel and stereo channel.

To implement a channel converter is quite easy. The critical part of this kind of converter is to transform the input data as interleaving to output. Let us look the following diagrams that might be helpful.

For example, we get an original input data like table 1.
Seq. (input)
0
1
2
3
Data
0xaa
0xbb
0xcc
0xdd
Table 1. The original input data

And what we want to do is to duplicate the same data interleavely to another one. That will make the left channel and the right channel has the same data as table 1, such like table 2 and table 3.
Seq. (left)
0
1
2
3
Data
0xaa
0xbb
0xcc
0xdd
Table 2. The left output data
Seq.
(right)
0
1
2
3
Data
0xaa
0xbb
0xcc
0xdd
Table 3. The right output data

Thus, the output data will be like table 4.
Seq. (output)
0 (L)
0 (R)
1 (L)
1 (R)
2 (L)
2 (R)
3 (L)
3 (R)
Data
0xaa
0xaa
0xbb
0xbb
0xcc
0xcc
0xdd
0xdd
Table 4. The stereo data come from table 1

There is a sample code just for reference:

int converter(int8_t *input_data, size_t size)
{
    int8_t *output_data = (int8_t)malloc(sizeof(int8_t)* size * 2);
    int i = 0, pos = 0;

    for(i; i < size; i++){
        memcpy(output_data[pos],  input_data[i], 1);
        memcpy(output_data[pos + 1], input_data[i], 1);

        pos += 2;
    }
}

However, the format what you are processing is important too. The above one is only for a 8-bits and little-significant(LS) format. If some people who just apply the above sample codec into a 16-bits and LS format, they will find the left data and the right data are totally different. The output is like table 5.

Seq. (output)
0 (L)
0 (R)
1 (L)
1 (R)
Data
0xaaaa
0xbbbb
0xcccc
0xdddd
Table 5. The output data with wrong format (8-bits LS into 16-bits LS)
In this case, there is a result that I record it before and the result showed as figure 1.
Figure 1.  The output data with wrong format (8-bits LS into 16-bits LS)

Therefore it needs another version for 16-bits LS and it will looks like as following.

int converter(int8_t *input_data, size_t size)
{
    int8_t *output_data = (int8_t)malloc(sizeof(int8_t)* size * 2);
    int i = 0, pos = 0;

    for(i; i < size; i++){
        memcpy(output_data[pos],  input_data[i], 2);
        memcpy(output_data[pos + 2], input_data[i], 2);

        pos += 4;
    }
}

Finally we will get the result as table 6.
Seq. (output)
0 (L)
0 (R)
1 (L)
1 (R)
Data
0xaabb
0xaabb
0xccdd
0xccdd
Table 6. The output data of 16-bits LS.
This skill is useful when it need to stream a voice data from a Bluetooth module to an audio codec while playing Hand-Free profile (HFP). In an automotive software system, sometimes our company will offer customers software solution for applying acoustic echo cancellation (AEC). In that situation, the streaming of voice is controlled by CPU and it will make decision how to transfer audio data between a Bluetooth module and an audio-codec. Mostly, a Bluetooth module only support mono channel but an audio-codec need stereo data.

Figure 2. Architecture of automotive audio components

O.T.