33134


以下の様な無線デバイスの開発を行っています。

  1. 親機と子機となるデバイスがあり、デジタル無線で通信を行っている。
  2. 子機は環境音の収集を行い10kHz/16bitサンプルデータをADPCM(4bit)に圧縮して、1パケット(約)160バイトずつ親機へ送信する。
  3. 親機は子機から受信したデータを伸張して再生する。
  4. 親機は子機からのデータを取りこぼした場合、受信する予定だったデータを0x00(1パケット取りこぼしたら0x00*160バイトの)として補完する。

※子機は片方向で音声データを送信しており、親機はそれに対するACKの様なものは応答しない。

ADPCMは過去のサンプルデータと現在のサンプルデータの差分を利用したアルゴリズムである為、上記4の処理を行ってしまうと、そのタイミングで再生音が意図しない音になってしまいます。  
具体的には著しく、音量が低下します（このメカニズムもなぜかはわかっていません...）。

電話などの開発を行ったことがある方で、音声が途切れる時のデコード処理などの工夫をしたことがある方など、ノウハウをご教示頂けると幸いです。


CC BY-SA 3.0
2017-03-06T05:31:30.257
33122
2017-03-06T10:05:31.547
15316
question
c
ADPCMデコード時のアイデアについて


データエラーをある程度許容するマルチメディア通信（音声通信・映像通信）を仮定した一般論をいくつか提示します。

  * [A] データ中に「同期ポイント」を定期送信する。例: 映像コーデックの"キーフレーム"。
  * [B] データとともにエラー訂正符号を同時送信する。例: FEC(Forward Error Correction)。
  * [C] 受信側でデータ異常を検知した場合は再送要求を行う。例: RTP/RTCP通信によるパケット再送要求。
  * [D] 通信トランスポート層に高信頼プロトコルを用いる。例: TCP上で行われるHLS(HTTP Live Streaming)。SCTP(Stream Control Transmission Protocol)。

今回利用されるADPCM符号化では、データ破損点に続くデータを正しくデコードすることが **原理的に**
出来ません。少なくとも[A]（または[D]）対応が必須になります。つまりデータ破損点から次の同期ポイントまでのデータは諦め、同期ポイントから改めてデコードを再開することになります。

* * *

>
> ADPCMは過去のサンプルデータと現在のサンプルデータの差分を利用したアルゴリズムである為、上記4の処理を行ってしまうと、そのタイミングで再生音が意図しない音になってしまいます。  
>  具体的には著しく、音量が低下します。

既に言及されている通り、過去サンプルデータを強制的に0x00としているため、デコーダ側では値0からの差分値（つまり非常に小さな値）として復号しています。言い換えると、データ破損点を境にPCMデータの絶対値が失われています。


CC BY-SA 3.0
2017-03-06T09:59:49.103
33134
2017-03-06T10:05:31.547
2017-03-06T10:05:31.547
49
49
33122
answer