C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: C#で高速モールス信号を作り再生したい


(過去ログ 112 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■66494 / inTopicNo.1)  C#で高速モールス信号を作り再生したい
  
□投稿者/ momkuma (1回)-(2013/04/29(Mon) 15:16:42)

分類:[C#] 

OS:windouws7
アプリ:VisualStudio2010express (C#)

次のコードで曲がりなりにもCQと音は出ますが、tantenがこれ以下になると、いわゆるキークリックの様な立ち上がり・下がりが影響するのか音質がわるくて使えません。

tantenの長さを10mS位まで耐えられるような音にしたいのです。別にBeep()でなくてもよいのですが、soundPlay()ででも試したのですがやはり80mS以下になると駄目です。
 
この様な音声の発生は、C#を業務としている方でも馴染みが無い様でお尋ねしたのですが分かりませんでした。

立ち上がりをスムースにすれば良いのではないかとは想像するのですが、soundPlay()ではどの様にcodingすればいいのか、またBeep()には周波数と持続期間の設定しか無い様でここで行き詰っております。 

下にあるように高速モールス音を出すには、どんな方法があるのか教えて頂ければ幸いです。

http://homepage1.nifty.com/jr4qpv/cwt/cwtwpro.htm (CWTWと言う有名ソフト)


private void button1_Click(object sender, EventArgs e)
{
    int tanten = 150;    //ミリ秒
    int cyoten = tanten * 3; 

    //Cのモールス発生
    Console.Beep(500, cyoten); 
    Console.Beep(500, tanten);
    Console.Beep(500, cyoten);
    Console.Beep(500, tanten);

  //cyotenと同じ期間お休み (文字間の区切り)
    System.Threading.Thread.Sleep(cyoten);

  //Qのモールス発生
    Console.Beep(500, cyoten);
    Console.Beep(500, cyoten);
    Console.Beep(500, tanten);
    Console.Beep(500, cyoten);
}

引用返信 編集キー/
■66507 / inTopicNo.2)  Re[1]: C#で高速モールス信号を作り再生したい
□投稿者/ Hongliang (54回)-(2013/04/30(Tue) 08:38:24)
長い音と短い音をwavファイルで用意しておいて、System.Media.SoundPlayerなどで再生させるのはどうでしょうか?
引用返信 編集キー/
■66508 / inTopicNo.3)  Re[1]: C#で高速モールス信号を作り再生したい
□投稿者/ daive (10回)-(2013/04/30(Tue) 09:29:43)
無線、アマチュア無線とも、自分で作ったり、操作したりはしていないのですが、
思考実験として、考えてみました。

まず、
>80mS以下
この考えが、ちょっとひっかかります。

以下Wikiより
モールス符号
http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%BC%E3%83%AB%E3%82%B9%E7%AC%A6%E5%8F%B7
国際モールス符号は短点(・)と長点(−)を組み合わせて、アルファベット・数字・記号を表現する。
長点1つは短点3つ分の長さに相当し、各点の間は短点1つ分の間隔をあける。また、文字間隔は短点3つ分、語間隔は短点7つ分あけて区別する。

また、基本は、ONOFF変調で、周波数変調、振幅変調とおも行わない、搬送波の有無での通信の筈です。
オンオフ変調
http://ja.wikipedia.org/wiki/%E3%82%AA%E3%83%B3%E3%82%AA%E3%83%95%E5%A4%89%E8%AA%BF
'
よって、トンとか、ツーとかいう音は、受信側で音にしている事になるはずです。
iPhone アプリでは、再生音500Hz〜1500Hz可変
Windows アプリでは、再生音自由設定、など
A、ラ:440Hz
トン、ツーが、どの音になるかは、知りません。

短点と、長点の数量(符号の組み合わせ)により、送受信時間が異なる、通信方式ということになります。
(現代のモデム、FAXなどとは、違う方法ということ。BPSとかという単位に馴染まない方法)

仮に100ms毎に、
(面倒なので、「文字間隔は短点3つ分、語間隔は短点7つ分」については、計算に入れない)
短点3回+点間3回
100ms / 6 ≒ 16.66 ms ⇒ 60Hz

長点3回+点間3回
=長点3回(短点3回分×3)+点間3回=短点12回分
短点:16.6ms と、仮に計算したので、
長点3回は、200ms程(5 Hz)、かかる。
この時の周期は、
16.666 × 3 ≒ 50ms ⇒ 20Hz

つまり、100ms毎とか希望しても、
100ms〜200ms位まで、変化する通信形態である。
ので、繰り返し周期は、正確には固定できない事になる。

100ms毎であれば、求めている事は、
20Hz:50ms〜60Hz:16.6666ms で、切り替えても、綺麗に聞こえる音

という事になるのかもしれません。
引用返信 編集キー/
■66510 / inTopicNo.4)  Re[2]: C#で高速モールス信号を作り再生したい
□投稿者/ momkuma (2回)-(2013/04/30(Tue) 15:45:47)
No66507 (Hongliang さん) に返信
> 長い音と短い音をwavファイルで用意しておいて、System.Media.SoundPlayerなどで再生させるのはどうでしょうか?

そういう方法も考えたのですが、fileのstart/stopのtimingが合わないだろうと思っております。
例えば英語のeel(ウナギの意味)を発生させたたいとき、短点-短点-長音とfileを呼び出す必要があります。
この短点-短点-長音の空白の部分は短点と同じ時間でなければいけません。

必要なword数が少なければ、fileにしておくというのも有りかと思いますが、実践上どうかなと疑問を持ってます。

コメント有難うございました
引用返信 編集キー/
■66512 / inTopicNo.5)  Re[2]: C#で高速モールス信号を作り再生したい
□投稿者/ momkuma (3回)-(2013/04/30(Tue) 16:38:32)
No66508 (daive さん) に返信
> 無線、アマチュア無線とも、自分で作ったり、操作したりはしていないのですが、思考実験として、考えてみました。
>
> まず、80mS以下 > この考えが、ちょっとひっかかります。

書き遅れましたが、パソコンでモールスを発生し、それをパソコンで受信練習するという使い方を目標としております。

モールスの速度は、PARIS速度で測られます。 例えば24WPMは120字/分に相当します。これは1秒間に2文字に相当します。1文字500mSですので、例えば数字の「5 = ・・・・・」を例にとりますとモールス符号としては一つの短点の持続時間は50mSとなります(短点・短点間は1短点、符号後の空白を3短点としています。全部で10短点となります)。だから出だしの数mSを徐々にupしていけば綺麗に聞こえるかなと考えたわけです。

これをBeep関数で発生させるには、Beep(500,50)ですね、もうこの段階で良い音はしないのです。「トトトトト」と綺麗になることを期待したのですが、「トットットットットッ」のようにクリック音が入るのです。 それにBeepには周波数と持続時間以外に変更できないと理解しています。

実際の電波で飛び交っているCWの信号を受信するとそんなことは起きず、綺麗なモノトーンで聞こえます(受信機の設定次第ですが)。 また巷にある数多のCW発声ソフトは、実に綺麗な音で発生させてくれます。


BeepだからNGなのかと思い、sin波(別スレッドで)を下のcodeでon-offしてsoundPlay()で発声させました(例:数字の5)。
tantenを50(50mS)とするとBeepの時と同じようにキークリック発生します。100mS以上なら音質は許容範囲にはいります。
tantenの数字(mS)設定を変えて速度を変更しようとしております。

private void _5()
{
Tanten(); //tanten=50mS
System.Threading.Thread.Sleep(tanten);  //tanten=50mS
Tanten();
System.Threading.Thread.Sleep(tanten);
Tanten();
System.Threading.Thread.Sleep(tanten);
Tanten();
System.Threading.Thread.Sleep(tanten);
Tanten();
System.Threading.Thread.Sleep(tanten*3);  //次の単語までの間は3短点
}

private void Tanten()
{
player.PlayLooping();
System.Threading.Thread.Sleep(tanten);
player.Stop();
}

BeepもsoudPlayも50mSの持続時間にすると綺麗には発生しないのは確かです。 このやり方では鳥の鳴き声を作りたいなどと言う時は出来ませんね。

上手く説明できていませんが、何か考え方がおかしいでしょうか?

引用返信 編集キー/
■66513 / inTopicNo.6)  Re[3]: C#で高速モールス信号を作り再生したい
□投稿者/ jiji (1回)-(2013/04/30(Tue) 19:16:57)
ハードウェアのビープ音は通常音質を全く考慮してません。
それゆえ(スイッチング)ノイズや歪みを多分に含んでいます。
そもそもハードウェアビープ音用のスピーカを積んでないPCすらあります。

そこで提案ですが、
MIDIシークェンスにしてスタンダードMIDIファイル(又はストリーム)を作り、お好きなメディアプレーヤーで鳴らすのは如何でしょう?
引用返信 編集キー/
■66552 / inTopicNo.7)  Re[4]: C#で高速モールス信号を作り再生したい
□投稿者/ momkuma (4回)-(2013/05/06(Mon) 11:45:16)
No66513 (jiji さん) に返信
> ハードウェアのビープ音は通常音質を全く考慮してません。
> そこで提案ですが、
> MIDIシークェンスにしてスタンダードMIDIファイル(又はストリーム)を作り、お好きなメディアプレーヤーで鳴らすのは如何でしょう?

jijiさん、コメント有難うございます。

綺麗に発生しているソフトの波形をスペアナで立ち上がり・下がりを調べてみました。そうしたら実にスムースに立ち上がりと下がりを処理していました。 jijiさんのご提案も含めこれらの窓関数みたいなものも検討したいと思います。

有難うございました。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -