Python Numpy中出现意外的傅里叶变换结果

时间:2017-04-01 03:31:08

标签: python python-2.7 numpy signal-processing fft

我在绘制数据序列的傅里叶变换时遇到问题(Y =强度,X =波长)。目标是消除正弦振荡,但将陷波滤波器应用于数据的傅立叶变换,然后进行另一次傅里叶变换。

以下是原始数据系列:

df = pd.read_csv(file, sep='\t', skiprows=7)
df.plot(x='X', y='Y')

enter image description here

进行傅里叶变换后:

df['spectrum'] = np.fft.fft(df[['Y']]).real
df['freq'] = np.fft.fftfreq(len(df.index), 1)
df.plot(x='freq', y='spectrum')

enter image description here

问题:为什么没有投影? FFT是否做错了?

数据

X   Y
500 383.800049
501 -407.599976
502 435
503 -446.8
504 442.800049
505 -419.399963
506 425.200073
507 -423.599976
508 387.400024
509 -438.199951
510 473.599976
511 -446.399963
512 392.599976
513 -393
514 414.599976
515 -392.199951
516 469.599976
517 -359.8
518 544.6
519 -365.399963
520 535.2001
521 -361.399963
522 527.4
523 -389.399963
524 556.6
525 -399
526 534.800049
527 -360.8
528 689.2001
529 -206.399963
530 904.2001
531 51
532 1166.00012
533 230.200073
534 1338.4
535 254.200073
536 1192.6
537 149
538 925.7999
539 -119.599976
540 745.800049
541 -329.399963
542 602.2001
543 -344
544 469.599976
545 -453.599976
546 384.800049
547 -485.599976
548 334.599976
549 -506
550 305.800049
551 -525.199951
552 412.400024
553 -419
554 404.599976
555 -466.199951
556 466.400024
557 -437.399963
558 478.400024
559 -389
560 478.599976
561 -391.199951
562 461.200073
563 -366
564 481.599976
565 -414.399963
566 525.800049
567 -379.8
568 495.200073
569 -368.599976
570 518.800049
571 -388
572 485
573 -412.599976
574 519.4
575 -383
576 656.2001
577 -334
578 609.800049
579 -304.399963
580 563.800049
581 -352.199951
582 567.2001
583 -372.399963
584 463.400024
585 -362.399963
586 516.2001
587 -309.199951
588 548.4
589 -340.8
590 627
591 -352.199951
592 686.2001
593 -302.599976
594 736.4
595 -301.399963
596 716.800049
597 -337.399963
598 642.2001
599 -332.599976
600 646.800049
601 -316.399963
602 733.800049
603 -274.199951
604 715.800049
605 -325.8
606 683.6
607 -352.8
608 581
609 -352.399963
610 611.2001
611 -360.8
612 555.800049
613 -348.199951
614 583.4
615 -416.8
616 539.4
617 -337.199951
618 607.4
619 -310.8
620 542.800049
621 -300.8
622 534.4
623 -295.399963
624 603.6
625 -348
626 599.800049
627 -252.199951
628 576.800049
629 -309
630 703.4
631 -300.399963
632 621.800049
633 -345.199951
634 586.2001
635 -314.8
636 615.2001
637 -352.399963
638 623.800049
639 -281.399963
640 636.2001
641 -367
642 546
643 -295
644 595.4
645 -342.399963
646 554.6
647 -358.399963
648 567.4
649 -379
650 581.2001
651 -383.8
652 497.400024
653 -343.399963
654 588
655 -379
656 524.6
657 -365.8
658 506.200073
659 -413.8
660 554.800049
661 -391.8
662 541.800049
663 -409.199951
664 573
665 -390.399963
666 535
667 -373.8
668 513.2001
669 -376
670 538.4
671 -391
672 566.2001
673 -424.199951
674 493.200073
675 -471.199951
676 408.800049
677 -454
678 289
679 -612
680 252.200073
681 -413.8
682 465.800049
683 -251.399963
684 708.2001
685 -134.599976
686 860.2001
687 -56.4000244
688 907.7999
689 23.2000732
690 935.2001
691 9.599976
692 960.0001
693 201.599976
694 1355.6
695 78.4000244
696 1265.79993
697 0.200073242
698 1283.6
699 -11
700 1103.20007
701 -50.4000244
702 1067.00012
703 -35
704 1080.79993
705 -67.5999756
706 1025.6
707 -155
708 945.4
709 -129.399963
710 835.800049
711 -230.599976
712 722.800049
713 -267.199951
714 743.2001
715 -281.199951
716 675
717 -278.599976
718 612.800049
719 -283.399963
720 687
721 -296.199951
722 626.6
723 -292.599976
724 674.800049
725 -264
726 663.800049
727 -272.199951
728 644.6
729 -266
730 608.4
731 -293
732 660.2001
733 -291.599976
734 690.4
735 -274.399963
736 646.2001
737 -233
738 645.800049
739 -206.599976
740 641.4
741 -222.599976
742 671.6
743 -282.199951
744 664.6
745 -207.399963
746 689
747 -277.8
748 662
749 -236.199951
750 710.4
751 -198.399963
752 747.2001
753 -227.599976
754 704
755 -278.199951
756 731
757 -237
758 698.4
759 -284
760 613
761 -289.8
762 638.4
763 -297.599976
764 696.800049
765 -245.799988
766 628.2001
767 -218.399963
768 657
769 -276.8
770 680.4
771 -256
772 656.800049
773 -305.399963
774 613.800049
775 -354.399963
776 755.2001
777 -282.199951
778 778.4
779 -267.199951
780 691.800049
781 -261.399963
782 732.4
783 -287.8
784 690.2001
785 -292
786 711.2001
787 -262.199951
788 751.800049
789 -286.8
790 680.800049
791 -273
792 688.800049
793 -256.199951
794 713.6
795 -293.199951
796 679.800049
797 -324.8
798 607
799 -345.199951
800 548.4
801 -339.8
802 550.4
803 -359.399963
804 557.2001
805 -326.399963
806 536
807 -409.599976
808 462.400024
809 -453
810 466.800049
811 -450.599976
812 531
813 -384.8
814 585
815 -291.399963
816 608.6
817 -380.199951
818 530.4
819 -387.199951
820 539.4
821 -327
822 597.2001
823 -321.599976
824 284.200073
825 -586
826 211.800049
827 -509
828 220.200073
829 -586
830 186.200073
831 -577.399963
832 222.200073
833 -538.8
834 200.200073
835 -598.199951
836 196.599976
837 -571.8
838 148.599976
839 -612.399963
840 193.400024
841 -589.399963
842 206.200073
843 -593
844 144.599976
845 -572.399963
846 141.400024
847 -598
848 156.200073
849 -604.8
850 160.800049
851 -562
852 87.5999756
853 -649
854 84.5999756
855 -649
856 166.400024
857 -537.6
858 207
859 -549.8
860 213.599976
861 -543.6
862 193
863 -555.199951
864 234.800049
865 -563.6
866 221.599976
867 -503
868 196.599976
869 -570.8
870 224.200073
871 -556.8
872 193.400024
873 -545.399963
874 163.599976
875 -584.399963
876 598
877 -432.399963
878 497.599976
879 -440.8
880 410.200073
881 -513.399963
882 389.400024
883 -519
884 324
885 -554.8
886 273.800049
887 -529.8
888 255.400024
889 -615
890 219.599976
891 -537.399963
892 194.599976
893 -464
894 517.4
895 -380.199951
896 498.400024
897 -469.199951
898 425.400024
899 -394.199951
900 467.200073
901 -453.399963
902 522.6
903 -383.8
904 557
905 -365.399963
906 526.6
907 -342.8
908 544.4
909 -367.8
910 534.4
911 -429
912 565
913 -383.599976
914 483.599976
915 -371.199951
916 562
917 -374.199951
918 521
919 -517.8
920 425.200073
921 -469.599976
922 492.800049
923 -467.399963
924 409.200073
925 -455.199951
926 384.800049
927 -481.199951
928 408.200073
929 -449.8
930 503
931 -429.599976
932 540.2001
933 -432.8
934 476.800049
935 -420
936 428.599976
937 -547.399963
938 124.200073
939 -620.399963
940 130.599976
941 -583.8
942 113.400024
943 -617.399963
944 141
945 -606.399963
946 107
947 -640
948 98.4000244
949 -604.8
950 120.400024
951 -585
952 260.800049
953 -503
954 261.800049
955 -537
956 248.800049
957 -536.199951
958 211.800049
959 -500.8
960 255.400024
961 -501.399963
962 238.599976
963 -529
964 254.800049
965 -506.599976
966 226.400024
967 -476.599976
968 224.200073
969 -504.399963
970 141
971 -608.199951
972 146.800049
973 -600.399963
974 161
975 -579.399963
976 274
977 -519.6
978 297.400024
979 -542.8
980 256
981 -520.8
982 280.599976
983 -544.8
984 284.200073
985 -522
986 277.599976
987 -492.199951
988 277
989 -511.599976
990 246.599976
991 -537.399963
992 301.800049
993 -474.8
994 268.599976
995 -503
996 253.200073
997 -506.8
998 265.599976
999 -495.399963
1000    234.599976
1001    -519.399963
1002    246.200073
1003    -489
1004    306
1005    -533.6
1006    296
1007    -502.199951
1008    293.800049
1009    -494.199951
1010    304
1011    -461.199951
1012    279.200073
1013    -526.199951
1014    279.200073
1015    -473.8
1016    293.599976
1017    -460
1018    307.400024
1019    -520.6
1020    337.200073
1021    -503.599976
1022    284
1023    -516.8
1024    326.400024
1025    -479.8
1026    337.200073
1027    -503
1028    329.800049
1029    -467.599976
1030    322.800049
1031    -499.8
1032    351
1033    -490.199951
1034    354
1035    -474
1036    343.800049
1037    -472.8
1038    356.400024
1039    -457.8
1040    364
1041    -465.599976
1042    434
1043    -438.399963
1044    418.800049
1045    -412
1046    412.400024
1047    -455.399963
1048    452.200073
1049    -457.8
1050    394.200073
1051    -427
1052    422.599976
1053    -333.8
1054    561
1055    -351.199951
1056    503
1057    -470.199951
1058    508
1059    -448.599976
1060    484.800049
1061    -392.199951
1062    499.200073
1063    -424.599976
1064    473
1065    -417.599976
1066    518.800049
1067    -389.199951
1068    539.6
1069    -420.399963
1070    475.599976
1071    -385
1072    515.2001
1073    -388.199951
1074    521.4
1075    -414.599976
1076    462.800049
1077    -398.199951
1078    468.400024
1079    -468.599976
1080    427.400024
1081    -481.199951
1082    284.400024
1083    -608.199951
1084    175
1085    -627.8
1086    135
1087    -659.199951
1088    136.400024
1089    -623.199951
1090    143.599976
1091    -600
1092    147.800049
1093    -599.6
1094    113
1095    -614.8
1096    141.599976
1097    -642.6
1098    157.400024
1099    -611.399963
1100    147.200073
1101    -610.199951
1102    164.200073
1103    -637.8
1104    146.800049
1105    -581.8
1106    125.800049
1107    -629.6
1108    167
1109    -569
1110    94.20007
1111    -604.6
1112    142.400024
1113    -602.199951
1114    116
1115    -606.8
1116    142.400024
1117    -580
1118    117.200073
1119    -596.399963
1120    145.599976
1121    -620.6
1122    110.599976
1123    -625.8
1124    89.80005
1125    -619
1126    139
1127    -583.199951
1128    146.800049
1129    -593
1130    140.599976
1131    -597.6
1132    148
1133    -650
1134    118.800049
1135    -596.199951
1136    352.400024
1137    -444.199951
1138    381.400024
1139    -492.8
1140    334.400024
1141    -497.399963
1142    347
1143    -484.399963
1144    330.400024
1145    -483.599976
1146    357.599976
1147    -523.199951
1148    315.200073
1149    -503.399963
1150    345.800049
1151    -487.199951
1152    355.400024
1153    -456.599976
1154    370
1155    -497.199951
1156    379.800049
1157    -458.399963
1158    409.400024
1159    -503.599976
1160    320.400024
1161    -459
1162    397.200073
1163    -486.599976
1164    354.599976
1165    -439.8
1166    418.200073
1167    -454.199951
1168    334.599976
1169    -436
1170    341.400024
1171    -469.599976
1172    406.200073
1173    -489.8
1174    384.200073
1175    -479.199951
1176    373.400024
1177    -446
1178    401.800049
1179    -455.599976
1180    344
1181    -471.599976
1182    386.400024
1183    -465.8
1184    363.400024
1185    -480
1186    410.599976
1187    -462.199951
1188    450
1189    -452.8
1190    351.800049
1191    -484.8
1192    393.400024
1193    -439.399963
1194    397
1195    -471.8
1196    426.599976
1197    -381.199951
1198    418.400024
1199    -418
1200    426.800049
1201    -447
1202    366.800049
1203    -431.8
1204    443.400024
1205    -460.8
1206    440.400024
1207    -416.199951
1208    409.599976
1209    -397.199951
1210    427.400024
1211    -394.599976
1212    495.599976
1213    -408.8
1214    470.400024
1215    -421.8
1216    517.800049
1217    -442.399963
1218    527.2001
1219    -399.199951
1220    544.2001
1221    -354
1222    535.4
1223    -358.399963
1224    527.6
1225    -374
1226    599
1227    -392
1228    590.4
1229    -327.8
1230    602.6
1231    -353.199951
1232    650.2001
1233    -369.599976
1234    642
1235    -359
1236    725.800049
1237    -296.599976
1238    734.4
1239    -223.199951
1240    766.4
1241    -287.8
1242    752.2001
1243    -277.199951
1244    828.4
1245    -233.199951
1246    809
1247    -198
1248    773
1249    -228.799988
1250    803.800049
1251    -278
1252    767
1253    -238
1254    859.800049
1255    -238.399963
1256    740.4
1257    -269.599976
1258    742.6
1259    -297.199951
1260    714.800049
1261    -344
1262    616.2001
1263    -342.8
1264    654.2001
1265    -365.199951
1266    660.4
1267    -372.199951
1268    669.2001
1269    -299.599976
1270    667.2001
1271    -345
1272    637
1273    -357.8
1274    646.800049
1275    -381.399963
1276    652.800049
1277    -378.199951
1278    622.4
1279    -347.199951
1280    647.6
1281    -361.599976
1282    646.800049
1283    -371.399963
1284    601.4
1285    -360.199951
1286    630.4
1287    -289.599976
1288    619
1289    -304.199951
1290    672
1291    -368
1292    591.4
1293    -375.399963
1294    590.4
1295    -442
1296    578
1297    -424.199951
1298    626.800049
1299    -384.8
1300    616.6

1 个答案:

答案 0 :(得分:2)

三个问题。

(1)比较以下两个:

df[['Y']].as_matrix().shape # (801, 1), yours
df['Y'].as_matrix().shape   # (801,), better

np.fft.fft表示如果未提供axis,则使用最后一个轴。在您的代码中,沿着最后一个维度评估801乘1阵列的FFT,即1点FFT - 完全不是您想要的。

解决方案:取下一对支架。

(2)有了这个,np.fft.fft的输出就像预期的那样复杂。而不是采用它的真实组件,使用它的绝对值。

(3)此外,看起来Pandas情节在绘制np.fft.fftfreq的输出时存在一些问题,因为它的输出来自[0 ... 0.5 -0.5 ... 0]。简单的解决方案:使用np.fft.fftshift

#2-3的解决方案:

df['spectrum'] = np.abs(np.fft.fftshift(np.fft.fft(df['Y'])))
df['freq'] = np.fft.fftshift(np.fft.fftfreq(len(df.index), 1))

(#3的替代解决方案:使用np.fft.rfftrfftfreq,因为您的输入数据是真实的。)

最终代码:

import pandas as pd
import numpy as np

df = pd.read_csv('dat.csv', sep=',')
df.plot(x='X', y='Y')

df['spectrum'] = np.abs(np.fft.fftshift(np.fft.fft(df['Y'])))
df['freq'] = np.fft.fftshift(np.fft.fftfreq(len(df.index), 1))
df.plot(x='freq', y='spectrum')

结果:

Spectrum

建议:优于np.abs是使用db(分贝)。即,db = lambda x: 20 * np.log10(np.abs(x))。或者,如果那不是你的事,只需在对数刻度上绘制y轴。

观察:您应该能够通过对数据进行低通滤波来消除高频噪声,截止频率为0.25归一化Hz。 (如果你遇到麻烦,请告诉我。)如果我收集了这种数据,我会担心在ADC无法工作之前我的抗混叠滤波器 - 人们不应该在奈奎斯特频率。如果你得到很多别名,谁知道原始信号是什么。