[問題] FFT已回收

看板MATLAB作者 (千磨萬擊還堅勁)時間15年前 (2010/06/18 16:45), 編輯推噓0(007)
留言7則, 2人參與, 最新討論串1/1
我的問題是 當我用程式一 使喇叭輸出sin波 音效 用第二個程式 利用mic 收音 作fft 發現 我丟單頻sin波 比方說 40Hz 可是 fft 顯示 我的喇叭產生 40 80 120 160 ...Hz etc 之倍頻 但是我希望看到 是只有40 Hz 之 peak!!! 有高手知道為何如此嗎?? 以下程式可將 sin波 以60Hz 由筆電或電腦喇叭輸出 停止可輸入 stop(ao) Hz = 60; Repeat_time = 10000; % in second A=150; TT = 1000; ao = analogoutput('winsound'); addchannel(ao,1);%-- 2010/5/28 下午 3:55 --% set(ao,'SampleRate',Hz*TT) set(ao,'repeatoutput',Repeat_time*Hz-1) x = linspace(-pi, pi, TT)'; data3 = A*sin(x); putdata(ao,data3) ao start(ao) fprintf('done\n'); 以下程式 是由麥克風收集聲音 3秒 (可改) 做fft 作圖 圖一是振幅 圖二是功率譜 clear all fs = 44100; % Sampling frequency T = 1/fs; % Sample time N = 10000; duration = 3; t = [0:N-1]'/N; t = t*duration; fprintf('ok! Push any putton will start for %g sec;', duration);pause fprintf('working!'); y = wavrecord(duration*fs,fs); % n = d*f = samples; fs = sampling frequency. %y = sin(2*pi*50*t); p = abs(fft(y))/(N/2); % why N/2 ? p = p(1:N/2).^2; % why ^2 freq = [0:N/2-1]/duration; y(1:N); subplot(2,1,1) plot(t',y(1:N)) %axis([0 3 -1 1]) subplot(2,1,2) plot(freq,p) semilogy(freq,p) axis([0 500 0 1]); %fprintf('Over!\n');pause %wavplay(y,fs) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.72.3

06/18 17:57, , 1F
FFT不是你想的那個樣子,就算你的input是純60Hz的Sin
06/18 17:57, 1F

06/18 18:00, , 2F
因為window...等的原因,spectrum不會就只是impulse在相對應的
06/18 18:00, 2F

06/18 18:01, , 3F
60Hz and -60Hz
06/18 18:01, 3F

06/18 18:04, , 4F
詳細原因請查DFT的推導過程
06/18 18:04, 4F

06/20 12:00, , 5F
你問題的真正原因是因為你的麥克風跟喇叭所造成的失真
06/20 12:00, 5F

06/20 12:01, , 6F
如果你直接分析40 Hz的純弦波 則不會有這些失真問題
06/20 12:01, 6F

06/20 12:03, , 7F
請參考揚聲器的諧波失真 對你會有幫助
06/20 12:03, 7F
文章代碼(AID): #1C6p8i0t (MATLAB)