EDLC、電気二重層コンデンサ。
安価に、巨大な静電容量を手に入れられる。
欠点はESRが大きいこと、静電容量が大きすぎること、分子の移動なので、遅いこと、などなど。
音が良いのか悪いのか。それは聞いてみないとわからない。
聞いてみた。良いのか悪いのか、よくわからない。
もう少し増やしてもう一度聞いてから判断しよう。
片chあたり90Fにする予定。
EDLC、電気二重層コンデンサ。
安価に、巨大な静電容量を手に入れられる。
欠点はESRが大きいこと、静電容量が大きすぎること、分子の移動なので、遅いこと、などなど。
音が良いのか悪いのか。それは聞いてみないとわからない。
聞いてみた。良いのか悪いのか、よくわからない。
もう少し増やしてもう一度聞いてから判断しよう。
片chあたり90Fにする予定。
いつも、オーディオはCDなどのデータを、DACとヘッドホンなどを使って聞いてます。
たまたま機会があり、ホールで音楽鑑賞してきました。
生の音って良いですね。
また、ホールには空調があり、人がいます。
バックグラウンドノイズはけっこうなレベルだと知りました。
何を聞きたいか、それが大事なのか。
私はデータを保存して取っておくのが好きです。
曲のデータに限らず、いろいろ取っていますが、やはり曲のデータは多いです。
昔の曲を聞くことも多くあります。
DACの性能が上がって、いい音で聞こえるようになったのは良いのですが、
どうも音が気になるようになりました。
趣味で声の聞き分けをすることがあります。
しかし、なんだかうまくいかない。
例えば声優さんって声に特徴が大きいと思うのですが、
声を聞き分けようと思ったら、なんだかみんな同じ声に聞こえてきます。
どういうことなのでしょう。
やはり私のオーディオの音はまだまだということなのか。
それは当然あるとして(笑)それにしても。
そして、あることに気づきました。
曲のボリュームです。
だいたい最初から最後まで一貫して一定の音のボリュームを保っているように聞こえます。
さらに、どの曲もだいたい同じレベルのボリューム。
まあそうです、BGMとして流すとして、ボリュームが大きく変わるようでは
特に店とかで流すときに、ちょっとなあってなると思うのです。
つまり、コンプレッサーがかけてある。
かなりかけてあるみたいです。
自分でコンプレッサーのアルゴリズムに似た処理をプログラムを使って
かけたことがあります。
全体的な音のボリュームは上がり、小さい音が聞こえるようになりましたが、なんか散々な音になりました。
自分の持っているオーディオのソースが、だいたいそんな感じで。
そういう音を目指して作ったんだと言われれば仕方ないのですが、
私はコンプレッサーの少ない音のソースが欲しいなと
心から思っています。
コンプレッサーをかけると音の歪が出て、音がよろしくない、
と、一般の方が思うようなシステムを普及させることに、微力ながら
力を注ぎたい、そう思いました。
DACの話ではありません。
DACにもマイコンは使いますが、まず今回のようなケースには当てはまらないです。
昔も書いたんですが、今回は対策例(愚策のような気がします)。
マイコンを使う時、割り込み関数とメイン関数で同じ変数にアクセスしたいことがあります。
データの1かたまりが全部同時に読み書きできさえすれば、
読み書きのタイミングが問題になることがプログラムの仕様として要求されることは
メイン関数と割り込み関数で、ということであればそんなシビアな仕様にはしないと思います。
しかし、データが1つのかたまりとして整合性がとれなくなると、問題です。
割り込み関数側と、メイン関数側で、読み書きが同期的ではなく行われるようなケースでは
メインで読み書きしている最中に割り込みが入ることが考えられます。
昔の記事には、「割り込みを禁止しろ」と書きました。
対策の1つではあります。しかし、割り込みを禁止してしまうと、割り込みのタイミングが一定でなくなったり
割り込み要求が処理されるまでの時間が長くなったりします。
正確に◯msごとに割り込む、とか、割り込みを超高速で返さないとまずいときは困るんです。
私は、8bitのマイコンでは、1バイトのデータを操作することで対策しています。
1バイトなので、1命令で処理でき、データの整合が取れます。
uint16_t value1;
uint16_t value2;
uint8_t value1_main_using = 0;
main(){
if(value1_main_using == 0){
value1_main_using = 1;
// main using value1
// value1を操作
}else{
value1_main_using = 0;
// main using value2
// value2を操作
}
}
割り込みではvalue1_main_usingを読んで、反対側の変数にアクセスします。
value1_main_usingは割り込みでは操作しません。
ネットの記事を読んでいて、同じ操作をしたページを見たことがないんです。
みなさんどうやってるんでしょう。
ちなみに、この方法だと、割り込み関数で変数が更新されたかどうかわかりません。
更新されない場合もあるときは、
uint8_t updated1;
uint8_t updated2;
変数を追加すればよいです。
if(value1_main_using == 0){
value1_main_using = 1;
// main using value1
if(updated1){
// value1を操作
updated1 = 0;
}
}else{
value1_main_using = 0;
// main using value2
if(updated2){
// value2を操作
updated2 = 0;
}
}
こうすれば、割り込みで値が更新されたときだけ処理できます。
作業は面倒ですが、割り込みを切りたくないけど、データが壊れると困るときは
これに限ります。
普通の人はPICではIFとIEを割り込みでどちらも見て処理し、
IEを切るのでしょうか。
割り込み関数のリアルタイム性も、割り込み関数内に分岐があると意味ありませんし。
作業量を考えると、そちらのほうがいいかもしれませんね。
あまりにデータが大きく、処理に困る時に使うくらいでしょう。