質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

3767閲覧

音声信号のホワイトノイズ除去をリアルタイムで行いたい

tarak

総合スコア2

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2021/11/29 06:59

実現したいこと

マイクから入力されてくる音声信号(人間の声や物音など様々)に乗っているホワイトノイズを除去しながらほとんど遅延なく出力したいです。

###前提
AD変換はサンプリング周波数32kHzで入力前に16kHzのLPFを入れています。
それでもマイクの影響か回路の影響か、サーッというホワイトノイズのようなものが入ってきます。
出力音声を上げるとノイズも大きくなることから、データとして取得した段階で既にノイズが入ってきていると考えています。
ノイズの原因の特定も行いますが、プログラム面でノイズを除去することが目標です。

###試したこと
初歩的ですが、音声に窓関数をかけてFFTし、周波数ごとの強度で表示させた後に閾値以下の強度しか持たない周波数を0、もしくは1/10程度に下げましたがうまくいきません。
具体的には人の声が人の声らしくないと言いますか、言葉を言葉として聞き取れない、子音が消えているような感じと、車のスリップ音のようなキュルキュルした音が混ざっています。
強度が強い周波数の周りの周波数は例え強度が閾値以下であっても重要なのかもしれないと思い、強い強度周辺かつ閾値以下の周波数は弱めないようにもしましたが根本的には変わっていません。

FFTのプログラムは正しいことは確認済みです。
FFTは要素数128で行っています。これより多くすると「実現したいこと」で挙げた「ほとんど遅延なく」という部分が達成されなくなるので128より増やすことは考えておりません。

また、他にもAD変換や出力時点での不具合は無く、正しく処理されていることは確認済みです。
(DA変換時や出力時で少しノイズが乗る可能性はありますが…)

どのくらいをノイズと定めるのか、これは居る環境によって変わるとは思うので閾値も動的に変化させた方がいいとは思うのですが、それはまた今後やっていくものとして、今回は静的な閾値として考えさせてください。

自分では中々進歩がないので質問させていただきました。
何か知恵があれば教えていただけると幸いです。
また、何か条件等についての質問には答えられますが、実際に何か手法を教えていただいた場合、それを試すのは少し時間がかかるのでご了承いただきたいと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ozwk

2021/11/29 07:11

ホワイトノイズ(広い周波数領域で同程度の強度を示すノイズ)ですか?
tarak

2021/11/29 07:39

すみません。確かに厳密にホワイトノイズではないかもしれません。 テレビの砂嵐のような音だったのでホワイトノイズと記述しました。 スペクトルで見ると各周波数にランダムな強度で僅かに入っているノイズといった方が正しいかもしれません。 ただ、広い周波数領域に分布はしています。
cwi

2021/11/30 06:53

時間軸上で、低レベルの区間のゲインを落とせば実質的には問題ないのでは。音声よりノイズが十分小さければマスクされます。音声区間の歪も切り替わり時にしか起きません。 https://effector-guitar.com/noise-difference/ ノイズサプレッサー・ノイズリダクション・ノイズゲートの違いについて https://smokyedge.com/enginnering/%E9%9F%B3%E9%9F%BF/tips/zoom-noisereduction-off 1分でできるZoomで音声チャットの音質を劇的に改善する方法。 - Smoky Edge.inc
tarak

2021/11/30 07:26

ありがとうございます。 一応雑音は一定レベル以下の音量もしくは自己相関がない場合という条件でノイズサプレッサーのようなものは作り試しました。正直コレでも良いと言えば良いのかもしれませんが、この場合は音声に乗った雑音は消せません。 やはり音声に乗ってしまっている雑音も低減させたいと思っているところです…
thkana

2021/12/02 21:53

一応確認なのですが、 > AD変換や出力時点での不具合は無く、正しく処理されていることは確認済みです。 とのことですが、f特はいじらないで系を入力からFFT-逆FFTして出力まで通して音がちゃんとでていることは確認されている、ということでしょうか。
tarak

2021/12/03 05:56

はい。その通りです。
guest

回答2

0

自己解決

結果としてはスペクトルの引き過ぎでした。
波形が歪んでいたようです。
当初のように閾値を定めてカットもしくは減衰させる方法も適切であることが確認できましたが精度が悪いです。
sn比が良い信号のほとんど気にならないノイズならコレでもいいかもしれません。

最終的には雑音と音声を自己相関によって区別し、雑音の部分を時間的に蓄積し続け、時間的に過去になればなるほど雑音の特性を弱めるように、直近の雑音の特性は強く出るように重みを付けて加算していき、ノイズ成分のスペクトル分布を作成、そして入力信号から減算することである程度抑制されました。

参考サイト
https://chuckischarles.hatenablog.com/entry/2019/12/28/101749

https://www.jstage.jst.go.jp/article/jasj/61/8/61_KJ00003301353/_pdf

投稿2021/12/03 15:40

tarak

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそも、

周波数ごとの強度で表示させた後に閾値以下の強度しか持たない周波数を0、もしくは1/10程度に下げました

が間違っています
ホワイトノイズのない音声信号をその処理をかけてどういう音になるのかを確認してみては。

投稿2021/11/29 07:05

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tarak

2021/11/29 07:44

回答ありがとうございます。 マイク入力ではなくライン入力にて2本~10本程度の正弦波の重ね合わせたノイズ無し信号を入力して同様の処理をしたことはありますが特に問題はないように感じました。 単純で周期的な正弦波信号だから問題がなかっただけなのでしょうか?
y_waiwai

2021/11/29 08:32

正弦波を入れたときの周波数スペクトルはどうなるかを考えてみればわかるのでは。 それと、音声を入れたときの周波数スペクトルは。
tarak

2021/12/02 16:51

すみません、やはりどうも何が悪いのか理解ができません… そもそもですが、周波数空間で信号を見ることは正しいのでしょうか? それとも、例えば時間-振幅の関係で信号を見て逆位相をぶつけてノイズを低減するノイズキャンセルのような処理の方が適切でしょうか? ただ、その場合は人間の声と他のノイズとの区別が出来ず、単に音量を下げているのと変わらないような気がするのですがどうでしょうか。
episteme

2021/12/02 22:53

↑ノイズキャンセリングはイヤホン外部のノイズ"だけ"をマイクで取り込み、それをひっくり返して重ねています。 だからこの問題には適用できませんね。
y_waiwai

2021/12/02 23:44 編集

だから、あなたのその処理をノイズのない音声信号に対して掛けてみればどうなるのかってのを見てみれば、それが正しいのか間違ってるのかすぐわかるでしょう。 まずはそれやってみましょうよ
tarak

2021/12/03 07:36

ノイズ無しの音声に関しても同じようにキュルキュルしたノイズが発生しました。 もしかしたら人の声とノイズが合わさっている部分に対して数値を変化させすぎなのかもしれません
taront

2021/12/03 08:37

まずはAudacityのようなフリーソフトでスペクトルをいじった時の影響を確認されてから、コード化に取り組まれてはどうでしょうか。 参考 https://vook.vc/n/598
y_waiwai

2021/12/03 08:47

ホワイトノイズ除去がそういう操作でできるというのはどこかに書いてあることなんでしょうか。 まあ、私の理解を超えた理論があって、あなたがそれを目指しているというのなら、がんばって実験を重ねてください、としか言いようがないですが。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問