###前提・実現したいこと
MATLABで3つの音の和音を鳴らした後、フーリエ変換してグラフにプロットしています。
###発生している問題・エラーメッセージ
各音階のy軸の値に差が出ています。
###該当のソースコード
MATLAB
1 2 3plot(f, abs(fy)/length(t)); 4xlabel('frequency (Hz)') 5ylabel('gain')
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
信号の時間範囲 t を増やせばよい。
%%
Fs = 8000; %サンプリングレート
A = 440; %Aの周波数
period = 1; %<----------------------------- period = 0.02を変更
t = (0:1/Fs:period-1/Fs);
%f = (1/period:1/period:Fs);
f = (0:Fs-1); %<---------------------------- 周波数領域を修正
sep = power(2, 1/12);
Cs = Apower(sep, 4);
E = Cspower(sep, 3);
% 〔信号の〕ひずみをなくすために0.2を各音に掛ける
y = 0.2sin(2pi*(A)t) + 0.2sin(2piCst) + 0.2sin(2piE*t);
%sound(y, Fs);
fy = fft(y);
plot(f, abs(fy)/length(t));
xlabel('frequency (Hz)')
ylabel('gain')
投稿2017/10/19 00:56
総合スコア1582
0
ベストアンサー
とりあえず期待通りにならない点についてのみのコメントです。解決策でなくてスミマセン
FFTは区間とサンプリング周波数で決まる最低周波数をF0とすると、サンプルの波形データから、F0の整数倍のスペクトルへ変換するものということなのですが・・・
通常、計算結果として出てくるスペクトルの各周波数は自然音階に対応する周波数とバッチリ一致してくれません。F0=30 Hzだとすると出てくるスペクトルの周波数は30, 60, ..., 420, 450, ...となるわけで、440 Hzちょうどのスペクトルは出てきません。本来の周波数と完全に一致した周波数のスペクトルは計算上正確に出てきますが、そこからずれるほど本来の周波数に対するスペクトル値よりも小さな値になると思います。
試しに自然音階ではなく、F0の正確な倍数の周波数の混合波形を作ってFFTをやってみてください。元の成分の大きさとばっちり一致した結果が得られると思います。
もしFFTの目的が「あらかじめ波形に含まれ得る周波数がわかっていて、その周波数の音の大きさを解析する」なら、より厳密な周波数分析の手法を用いるのだろうと想像します。一方、単に音声のスペクトルの雰囲気を「低音成分が大きい」「高音成分が大きい」という程度にわかればいいのなら、本件はあまり気にしなくていいと思います。
追記:
本来の周波数に対するスペクトル値よりも小さな値になる
以下は最低周波数F0とF0の8倍近くの波Fの2つの波を合成したFFT結果ですが、
左からF=F08, F=F08.1, F=F0*8.5にした時のものです。
感覚的な説明になりますが、これを見るとF=F08ちょうどの波(一番左)はスパイクがF08のスペクトルにのみ出ており、そこからF08.1, F08.5とずれるに従い周辺の周波数のスペクトルにスパイク成分が分散してしまっており、本来の周波数に一番近いスペクトルの値(スペクトルのピークの値)は小さくなっていることが見て取れると思います。これは離散フーリエ変換の一般的な特性です。
投稿2017/10/18 06:56
編集2017/10/19 02:12総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/19 01:26
2017/10/19 02:39 編集
退会済みユーザー
2017/10/19 05:15
2017/10/19 06:14
退会済みユーザー
2017/10/19 12:34
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/10/19 12:32