PX-Q1UDの購入を検討しているが、動作が不安定であると聞く。
想定される問題点を解消した上で、購入を検討したいため、分かっている現象があれば教えて欲しい。
こんなお悩みを解決します。
以前、譲ってもらったPX-S1UDの調子が悪くなったため、代替商品を探していました。
調査した結果、USB接続で地デジを4チャンネル同時に録画可能なPX-Q1UDという商品を見つけました。
これよりも前に発売されたPX-S1UDが1チャンネルのみだったことを考えると、価格の割に魅力的な商品ですね。
早速購入してセットアップをしましたが、受信ができておらず、期待通りの動作をしませんでした。
今回は、動作不良の原因の特定と問題点の解消ができたため、備忘録として残しておきたいと思います。
問題点解消のためにアッテネーターというものを利用しますが、その選び方についても解説するので、同様の問題で困っている方は、ぜひ最後までご覧ください。
テレビの映像が映らない原因
テレビの映像が映らない要因として、以下の2パターンが考えられます。
- 信号強度が不足しているため、映像を出力できない。
- 信号強度が過剰であるため、映像を出力できない。
どちらのケースにおいても、信号強度の適正値から外れているため、映像が映らなくなっていると言えます。
テレビの映像が映らない場合の解決策は、それぞれ以下のようになります。
原因 | 対策 |
---|---|
信号強度が不足している | ブースターにより信号を増幅させる |
信号強度が過剰である | アッテネーターにより信号を減衰させる |
調査方針と調査結果
今回は、信号強度の不足/過剰のいずれに該当するか分からなかったため、実際の信号強度を確認し、対策することとしました。
今回の確認環境は、以下を想定します。
項目 | 内容 |
---|---|
OS | Linux |
ディストリビューション | Ubuntu 22.04 LTS |
仮想環境 | Docker |
調査方針
こちらで配布されているrecpt1を改造し、必要な情報が取り出せるようにした上で、原因を調査します。
具体的な手順は、以下のようになります。
- 録画ツールrecpt1のうち、recpt1core.cを改造し、信号強度が確認できるようにする。
- 改造したrecpt1をコンパイルし、chkdvbsignalを生成する。
- chkdvbsignalを用いて、信号強度を確認する。
以降では、具体的なやり方を順に説明していきます。
recpt1core.cの改造
recpt1core.cの中に、calc_cnという関数が定義されています。
void
calc_cn(int fd, int type, boolean use_bell)
{
// 実装内容は省略
}
今回は、この関数を以下のように改造します。
// 【追加】結果出力用関数
static void
get_status(struct dtv_stats stat, char **output, const char *suffix)
{
*output[0] = '\0';
switch (stat.scale) {
case FE_SCALE_NOT_AVAILABLE:
sprintf(*output, "N/A");
break;
case FE_SCALE_COUNTER:
sprintf(*output, "%lld%s", stat.uvalue, suffix);
break;
case FE_SCALE_RELATIVE:
sprintf(*output, "%.2lf%s", (double)stat.uvalue / 655.35, suffix);
break;
case FE_SCALE_DECIBEL:
sprintf(*output, "%.5lf%s", (double)stat.svalue / 1000.0, suffix);
break;
default:
break;
}
}
void
calc_cn(int fd, int type, boolean use_bell)
{
struct dtv_property prop[4];
struct dtv_properties props;
char outputs[4*32];
char *ptr;
int idx;
int bell;
double CNR;
const char *suffixes[4] = {
"[dB]",
"[counts]",
"[counts]",
"[dBm]",
};
prop[0].cmd = DTV_STAT_CNR; // CNR
prop[1].cmd = DTV_STAT_ERROR_BLOCK_COUNT; // エラーブロック数
prop[2].cmd = DTV_STAT_TOTAL_BLOCK_COUNT; // 全ブロック数
prop[3].cmd = DTV_STAT_SIGNAL_STRENGTH; // 信号強度
props.props = prop;
props.num = 4;
if (ioctl(fd, FE_GET_PROPERTY, &props) < 0) {
fprintf(stderr, "ERROR: calc_cn() ioctl(FE_GET_PROPERTY) errno=%d(%s)\n", errno, strerror(errno));
}
else {
CNR = prop[0].u.st.stat[0].svalue / 1000.0;
// get status
for (idx = 0; idx < 4; idx++) {
ptr = &outputs[idx*32];
get_status(prop[idx].u.st.stat[0], &ptr, suffixes[idx]);
}
fprintf(stderr, "\033[2K");
fprintf(stderr, "\rCNR: %s ErrBlocks: %s TotalBlocks: %s SIG: %s", &outputs[0*32], &outputs[1*32], &outputs[2*32], &outputs[3*32]);
if(use_bell) {
bell = 0;
if(CNR >= 30.0) {
bell = 3;
}
else if(CNR >= 15.0 && CNR < 30.0) {
bell = 2;
}
else if(CNR < 15.0) {
bell = 1;
}
do_bell(bell);
}
}
return;
}
各定数の詳細は、こちらのサイトに解説があります。
コンパイル
必要なライブラリをインストールした上で、makeコマンドを用いてコンパイルを行います。
Dockerを用いてコンパイルしたので、Dockerfileもあわせて掲載します。
FROM node:16.14.0-buster-slim
# copy files
COPY ./recdvb /opt/recdvb
RUN apt-get update \
&& apt-get upgrade -y \
&& apt-get install -y --no-install-recommends \
ca-certificates \
gcc \
g++ \
build-essential \
libtool \
autoconf \
automake \
cmake \
make \
\
# recdvb
\
&& cd /opt/recdvb \
&& chmod +x autogen.sh \
&& ./autogen.sh \
&& ./configure \
&& make
ホストマシン上で実行したい場合、以下のshell scriptを参考にしてください。
#!/bin/bash
# 必要なライブラリをインストール
sudo apt-get update
sudo apt-get install -y --no-install-recommends ca-certificates gcc g++ build-essential libtool autoconf automake cmake make
# コンパイル
cd recdvb
chmod +x autogen.sh
./autogen.sh
./configure
make
信号強度の確認
Dockerを利用している方は、デバイス等を共有した上で、コンテナを起動後に以下のコマンドを実行します。
# コンパイルしたプログラムがあるところまで移動
cd /opt/recdvb
# コマンド実行
# format: ./chkdvbsignal --lnb 15 <channel number>
./chkdvbsignal --lnb 15 23
ホストマシン上で作業をしている方は、コンパイル済みのchkdvbsignalがあることを確認した上で、上記の最後のコマンドを実行します。
調査結果
今回は、電波強度を確認したいため、以下の3パターンに分けて計測しました。
項番 | 計測方法 | 狙い |
---|---|---|
No.1 | アンテナケーブルを通常通り差し込んで計測 | 信号強度の不足/過剰を判断するため |
No.2 | アンテナケーブルを差し込まずに計測 | ノイズレベルを把握するため |
No.3 | アンテナケーブルを半刺しした状態で計測 | 疑似的に減衰させて計測するため |
それぞれの計測結果を以下に示します。
No.1:アンテナケーブルを通常通り差し込んで計測
まず、アンテナケーブルを通常通り差し込んで計測しました。
結果は以下のようになり、CNRが0となっており、映像が映らない状態であることが分かります。
また、出力が安定しておらず、エラーブロック(ErrBlocks)もカウントされていることが確認できます。
No.2:アンテナケーブルを差し込まずに計測
次に、ノイズレベルを計測するため、アンテナケーブルを抜いた状態での計測しました。
信号強度が\(-82[\textrm{dBm}]\)になっており、電波強度が極めて弱いことが確認できます。
No.3:アンテナケーブルを半刺しした状態で計測
最後に、アンテナケーブルを半刺しした状態で計測しました。
この時の差し込み方は、以下のようになります。
計測結果は、以下のようになりました。
CNRが\(22[\textrm{dB}]\)、信号強度が\(-41[\textrm{dBm}]\)となっており、エラーブロックも発生していないことから、受信状況が安定していることが確認できます。
結果をまとめると以下のようになります。
計測方法 | CNR | 電波強度(SIG) | 受信状況 |
---|---|---|---|
アンテナケーブルを通常通り差し込んで計測 | \(0[\textrm{dB}]\) | \(-24[\textrm{dBm}]\) | 受信できていない |
アンテナケーブルを差し込まずに計測 | \(0[\textrm{dB}]\) | \(-82[\textrm{dBm}]\) | 受信できていない |
アンテナケーブルを半刺しした状態で計測 | \(22[\textrm{dB}]\) | \(-41[\textrm{dBm}]\) | 受信できた |
また、電波強度のイメージを図示すると以下のようになります。
以上から、電波強度が過剰なため、映像が映らない状態となっていた、ということが分かりました。
暫定的な対策
暫定的な対策としては、実験中に示した通り、半刺しの状態で運用する、という方法があります。
恒久的な対策
信号を減衰するために半刺しを行いましたが、恒久的な対策としては、信号を減衰させるためにアッテネーターを用いる、という方法があります。
以降では、アッテネーターの選び方と実際の取付方法について解説します。
アッテネーターの選び方
アッテネーターを選択する際は、どの位減衰させるべきかを判断した上で購入する必要があります。
今回は、信号強度(SIG)が\(-24[\textrm{dBm}]\)から\(-41[\textrm{dBm}]\)に減衰された結果、受信できる状態となりました。
よって、この変化分(dB)に相当するアッテネーターを購入すれば良いことになります。
今回は、上図の計測結果から、\(20[\textrm{dB}]\)のアッテネーターを購入しました。
アッテネーターによる減衰
最後に、実際にアッテネーターを接続して計測した結果を記載します。
使い方は簡単で、以下のようにPX-Q1UDとアンテナケーブルの間にアッテネーターを接続します。
この状態で先ほどと同様に、信号を計測した結果、以下のようになりました。
先程の半刺し状態と同程度の信号強度(SIG)になっており、CNRも\(22[\textrm{dB}]\)となっているため、問題ないと判断しました。
まとめ
今回は、PX-Q1UDで映像が映らない問題をアッテネーターを用いて解決する方法について解説しました。
先人が作成したプログラムをベースに要因を特定することで、適切に対処できました。
同様の問題で困っている方は、ぜひ参考にしてください。