Fourier Seri Çözümlemesi (Problem)

Başlatan ferdem, 10 Ocak 2012, 16:21:50

ferdem

Merhaba arkadaşlar, meşhur bilmeceler misal bir soru sormak istiyorum:

İçerisinde 50 Hz, 100 Hz ve 150 Hz frekanslı sinüzoidallerin bulunduğu bilinen bir kanal 50ms süresince 10KSample/s hızıyla (Ts=100e-6) yeterli çözünürlüğe sahip bir ADC ile örneklenmiştir ve bir txt dosyasına yazılmıştır. Sinüzoidallerin genlik ve faz bilgisi bulunmak istenmektedir.
Dosya: degerler.txt dosyası.
Bu sinüzoidallerin genlik ve faz bilgisini bulunuz, hangi yöntemle/nasıl bulduğunuzu kısaca izah ediniz.

Cevap formatı: A*sin(2*pi*50*t+fi1)+B*sin(2*pi*100*t+fi2)+C*sin(2*pi*150*t+fi3) olmak üzere sadece A-fi1, B-fi2, C-fi3 de yazılabilir.

GreeN

Vakit bulunca denemek isterim, fft yerine Goertzel algoritması daha uygun olacaktır.

http://www.fxdev.org/teoriden-gercege-goertzel-algoritmasi-vol-i/
Terörü Lanetliyoruz.

OptimusPrime

3*sin(2*pi*50*t-60)+2*sin(2*pi*100*t+0)+6*sin(2*pi*150*t-67.5)

olması lazım... ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

z

#3
FFT yada Fourier deyince bunları bizzat kullanmayanlar sorudan ürker. Soruyu değiştireyim ve damardan girelim.

Sinüsel bir sinyalimiz var ancak bunun ne frekansını ne de genliğini biliyoruz.

Scop ve frekansmetremiz malesef yok. Fakat  sinyal jenaratörümüz,  DC voltmetremiz ve analog işlemler yapabilen computerimiz (Çarpma bölme toplama, çıkarma vs yapabiliyor) var.

Verilen sinyalin frekansını ve genliğini nasıl bulursunuz?


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ferdem

OptiumusPrime, genlik spektrumunuz doğru ancak faz spektrumunuz hatalı. Görmek için plot(degerler) ve plot(my_values) gibi bir karşılaştırma yapılabilir:
Grafikler

Evet, genlik spektrumu belirlendi ancak fazlar düzeltimeli. Doğrusu budur diyenler?

Ek not: Bunalmis hocam sorunuz güzelmiş, önce şu ilk müşkülü halledelim :)

OptimusPrime

fazları da doğru ama cos a göre  ;D sinleri cos yapmayı unutmuşum.  :-[

dft cos u işaret eder çünki.

sin e göre de böyle

3*sin(2*pi*50*t+30)+2*sin(2*pi*100*t+90)+6*sin(2*pi*150*t+22.5)

kontrol ettim... ;)





https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

muhittin_kaplan

Alıntı yapılan: bunalmis - 11 Ocak 2012, 13:30:32
FFT yada Fourier deyince bunları bizzat kullanmayanlar sorudan ürker. Soruyu değiştireyim ve damardan girelim.

Sinüsel bir sinyalimiz var ancak bunun ne frekansını ne de genliğini biliyoruz.

Scop ve frekansmetremiz malesef yok. Fakat  sinyal jenaratörümüz,  DC voltmetremiz ve analog işlemler yapabilen computerimiz (Çarpma bölme toplama, çıkarma vs yapabiliyor) var.

Verilen sinyalin frekansını ve genliğini nasıl bulursunuz?
Sinyal jen. hesaplayacağımız sinyali üretmek için mi kullanılıyor yoksa extra mı ?

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ferdem

OptimusPrime hocam doğru değerleri bulmuşsunuz, tebrik ve teşekkür ederiz. Sorunun devamında kısaca yöntemden bahsedilmesi istenmişti :) Sonuçta bu işlem Matlab'da hazır araçlarla veya hesaplamalarla yapılabilir, C ile yapılabilir ve hatta Proteusta bile bir şekilde yapılabilir:)

Ben kendi kullandığım yöntemden bahsedeyim, Matlab'da hesaplayarak buluyorum. .m dosyam aşağıda:
data=importdata('degerler.txt');
Ts=100e-6;
f=50;
localdata=data(1:200);
localdata=localdata.';
c1=(2*f)*sum(exp(i*2*pi*1*f*[0:Ts:Ts*199]).*localdata)*Ts;
c2=(2*f)*sum(exp(i*2*pi*2*f*[0:Ts:Ts*199]).*localdata)*Ts;
c3=(2*f)*sum(exp(i*2*pi*3*f*[0:Ts:Ts*199]).*localdata)*Ts;

c=-i*[c1 c2 c3]; %sin olarak istendigi icin real/imag yer degistiriyor
c=c';
abs(c)
angle(c)

ans =

    3.0000
    2.0000
    6.0000


ans =

    0.5236
    1.5708
    0.3927

Kontrol için:
>> plot(data); hold on; plot(3*sin(2*pi*f*t+0.523)+2*sin(2*pi*2*f*t+1.57)+6*sin(2*pi*3*f*t+0.39),'--r');
>> legend('Degerler','Bulunan')

şu grafiği veriyor.

OptimusPrime

clear all;
close all;
clc;

x = [ 
5.7960
6.3840
6.9390
7.4540
7.9260
8.3530
8.7290
9.0520
9.3200
9.5300
9.6820
9.7730
9.8020
9.7710
9.6780
9.5260
9.3140
9.0460
8.7220
8.3460
7.9210
7.4500
6.9380
6.3880
5.8050
5.1940
4.5590
3.9070
3.2420
2.5690
1.8950
1.2240
0.56300
-0.085000
-0.71200
-1.3150
-1.8880
-2.4270
-2.9280
-3.3870
-3.7990
-4.1630
-4.4760
-4.7340
-4.9370
-5.0830
-5.1710
-5.2010
-5.1720
-5.0870
-4.9450
-4.7490
-4.5000
-4.2020
-3.8560
-3.4670
-3.0390
-2.5740
-2.0780
-1.5560
-1.0110
-0.45000
0.12300
0.70200
1.2830
1.8590
2.4260
2.9780
3.5110
4.0190
4.4990
4.9450
5.3540
5.7210
6.0440
6.3200
6.5450
6.7190
6.8390
6.9040
6.9130
6.8670
6.7650
6.6080
6.3970
6.1340
5.8220
5.4620
5.0580
4.6120
4.1290
3.6130
3.0670
2.4960
1.9050
1.2980
0.68000
0.057000
-0.56600
-1.1860
-1.7960
-2.3920
-2.9700
-3.5250
-4.0520
-4.5480
-5.0100
-5.4330
-5.8150
-6.1530
-6.4460
-6.6910
-6.8860
-7.0330
-7.1290
-7.1750
-7.1710
-7.1190
-7.0190
-6.8740
-6.6850
-6.4560
-6.1890
-5.8870
-5.5540
-5.1940
-4.8110
-4.4080
-3.9910
-3.5640
-3.1310
-2.6970
-2.2660
-1.8420
-1.4310
-1.0360
-0.66200
-0.31100
0.012000
0.30400
0.56300
0.78600
0.97100
1.1150
1.2180
1.2790
1.2970
1.2710
1.2040
1.0950
0.94500
0.75700
0.53200
0.27300
-0.018000
-0.33700
-0.68100
-1.0450
-1.4270
-1.8220
-2.2250
-2.6320
-3.0390
-3.4400
-3.8320
-4.2100
-4.5690
-4.9050
-5.2140
-5.4920
-5.7350
-5.9400
-6.1030
-6.2220
-6.2950
-6.3200
-6.2940
-6.2180
-6.0890
-5.9090
-5.6770
-5.3940
-5.0610
-4.6810
-4.2540
-3.7830
-3.2720
-2.7240
-2.1420
-1.5300
-0.89300
-0.23500
0.43900
1.1240
1.8150
2.5060
3.1940
3.8720
4.5350
5.1780
5.7960
6.3840
6.9390
7.4540
7.9260
8.3530
8.7290
9.0520
9.3200
9.5300
9.6820
9.7730
9.8020
9.7710
9.6780
9.5260
9.3140
9.0460
8.7220
8.3460
7.9210
7.4500
6.9380
6.3880
5.8050
5.1940
4.5590
3.9070
3.2420
2.5690
1.8950
1.2240
0.56300
-0.085000
-0.71200
-1.3150
-1.8880
-2.4270
-2.9280
-3.3870
-3.7990
-4.1630
-4.4760
-4.7340
-4.9370
-5.0830
-5.1710
-5.2010
-5.1720
-5.0870
-4.9450
-4.7490
-4.5000
-4.2020
-3.8560
-3.4670
-3.0390
-2.5740
-2.0780
-1.5560
-1.0110
-0.45000
0.12300
0.70200
1.2830
1.8590
2.4260
2.9780
3.5110
4.0190
4.4990
4.9450
5.3540
5.7210
6.0440
6.3200
6.5450
6.7190
6.8390
6.9040
6.9130
6.8670
6.7650
6.6080
6.3970
6.1340
5.8220
5.4620
5.0580
4.6120
4.1290
3.6130
3.0670
2.4960
1.9050
1.2980
0.68000
0.057000
-0.56600
-1.1860
-1.7960
-2.3920
-2.9700
-3.5250
-4.0520
-4.5480
-5.0100
-5.4330
-5.8150
-6.1530
-6.4460
-6.6910
-6.8860
-7.0330
-7.1290
-7.1750
-7.1710
-7.1190
-7.0190
-6.8740
-6.6850
-6.4560
-6.1890
-5.8870
-5.5540
-5.1940
-4.8110
-4.4080
-3.9910
-3.5640
-3.1310
-2.6970
-2.2660
-1.8420
-1.4310
-1.0360
-0.66200
-0.31100
0.012000
0.30400
0.56300
0.78600
0.97100
1.1150
1.2180
1.2790
1.2970
1.2710
1.2040
1.0950
0.94500
0.75700
0.53200
0.27300
-0.018000
-0.33700
-0.68100
-1.0450
-1.4270
-1.8220
-2.2250
-2.6320
-3.0390
-3.4400
-3.8320
-4.2100
-4.5690
-4.9050
-5.2140
-5.4920
-5.7350
-5.9400
-6.1030
-6.2220
-6.2950
-6.3200
-6.2940
-6.2180
-6.0890
-5.9090
-5.6770
-5.3940
-5.0610
-4.6810
-4.2540
-3.7830
-3.2720
-2.7240
-2.1420
-1.5300
-0.89300
-0.23500
0.43900
1.1240
1.8150
2.5060
3.1940
3.8720
4.5350
5.1780
% 5.7960
% 6.3840
% 6.9390
% 7.4540
% 7.9260
% 8.3530
% 8.7290
% 9.0520
% 9.3200
% 9.5300
% 9.6820
% 9.7730
% 9.8020
% 9.7710
% 9.6780
% 9.5260
% 9.3140
% 9.0460
% 8.7220
% 8.3460
% 7.9210
% 7.4500
% 6.9380
% 6.3880
% 5.8050
% 5.1940
% 4.5590
% 3.9070
% 3.2420
% 2.5690
% 1.8950
% 1.2240
% 0.56300
% -0.085000
% -0.71200
% -1.3150
% -1.8880
% -2.4270
% -2.9280
% -3.3870
% -3.7990
% -4.1630
% -4.4760
% -4.7340
% -4.9370
% -5.0830
% -5.1710
% -5.2010
% -5.1720
% -5.0870
% -4.9450
% -4.7490
% -4.5000
% -4.2020
% -3.8560
% -3.4670
% -3.0390
% -2.5740
% -2.0780
% -1.5560
% -1.0110
% -0.45000
% 0.12300
% 0.70200
% 1.2830
% 1.8590
% 2.4260
% 2.9780
% 3.5110
% 4.0190
% 4.4990
% 4.9450
% 5.3540
% 5.7210
% 6.0440
% 6.3200
% 6.5450
% 6.7190
% 6.8390
% 6.9040
% 6.9130
% 6.8670
% 6.7650
% 6.6080
% 6.3970
% 6.1340
% 5.8220
% 5.4620
% 5.0580
% 4.6120
% 4.1290
% 3.6130
% 3.0670
% 2.4960
% 1.9050
% 1.2980
% 0.68000
% 0.057000
% -0.56600
% -1.1860
% -1.7960    
];


Fs=10000;

figure, plot(x); title('Giriş');

y=abs(fft(x));
y=fftshift(y);
y=y/(length(x)/2);
F=[-length(x)/2:length(x)/2-1];
F=F*(Fs/length(x)); 
figure, stem(F,y); title('Genlik');

z=fft(x);
z=fftshift(z);
z=z/(length(x)/2);
F=[-length(x)/2:length(x)/2-1];
F=F*(Fs/length(x)); 

figure, stem(F, real(z)); title('Gerçek'); 
figure, stem(F, imag(z)); title('Sanal'); 


t=0:1/Fs:0.05-1/Fs;
%w=3*cos(2*pi*50*t-60*pi/180)+2*cos(2*pi*100*t+0*pi/180)+6*cos(2*pi*150*t-67.5*pi/180) ;
%w=3*sin(2*pi*50*t-60*pi/180+pi/2)+2*sin(2*pi*100*t+0*pi/180+pi/2)+6*sin(2*pi*150*t-67.5*pi/180+pi/2) ;
w=3*sin(2*pi*50*t+30*pi/180)+2*sin(2*pi*100*t+90*pi/180)+6*sin(2*pi*150*t+22.5*pi/180) ;
figure, plot(w); title('Tekrar oluşturulmuş işaret');


kısaca yöntemden bahsedelim dft.  :)

yanlız işaretin periodik olarak verilmesi gerekiyor o yüzden giriş işaretini biraz kırpmak zorunda kaldım. fft pencereleri ile bir kaç deneme yaptım ama haliyle oradan sadece harmonikler hakkında yorum yapılabiliyor, faz ı ve genliği oradan elde etmek çok zor...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

GreeN

Goertzel algoritması ile
3*sin(2*pi*50*t)+2*sin(2*pi*100*t)+6*sin(2*pi*150*t)

ifadesinin sonuçları ;
3,01312184333801    2,1023428440094         5,99147033691406 


şeklinde çıkıyor. Ama işin içine faz farkı girdimi işler değişiyor. sonuçlar tamamen farklı çıkıyor.
Terörü Lanetliyoruz.

OptimusPrime

işaretin periodik olduğu aralığı kullan...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||