clc; clear;
% ==============================
% 1. 加载SPD数据
% ==============================
wavelength_range = (360:830)';
spd_uniform = zeros(size(wavelength_range));
% 提供的SPD数据 (380nm-780nm)
spd_data = [ 380, 0.021608529; 381, 0.018694264; 382, 0.017377406; 383, 0.030297232;
384, 0.029682046; 385, 0.036093368; 386, 0.019471422; 387, 0.019676484;
388, 0.030977207; 389, 0.022569051; 390, 0.03220758; 391, 0.026130897;
392, 0.017949501; 393, 0.015574937; 394, 0.021856682; 395, 0.024339125;
396, 0.033405558; 397, 0.03796032; 398, 0.04034558; 399, 0.053999168;
400, 0.062936024; 401, 0.08373005; 402, 0.113050808; 403, 0.13985997;
404, 0.197109142; 405, 0.249658697; 406, 0.327715769; 407, 0.429331695;
408, 0.540649101; 409, 0.703401456; 410, 0.883055934; 411, 1.078100276;
412, 1.348361506; 413, 1.611840104; 414, 1.953801177; 415, 2.307667527;
416, 2.667705968; 417, 3.203668957; 418, 3.759319255; 419, 4.398523324;
420, 5.081767332; 421, 5.770522411; 422, 6.567811115; 423, 7.377835069;
424, 8.151807454; 425, 8.824999376; 426, 9.496309196; 427, 9.915708658;
428, 10.25328635; 429, 10.60439818; 430, 10.59647543; 431, 10.50510341;
432, 10.2508016; 433, 9.84749075; 434, 9.433736274; 435, 8.908624288;
436, 8.425792671; 437, 7.974165688; 438, 7.612117145; 439, 7.291147688;
440, 7.123279829; 441, 7.006257884; 442, 7.025406784; 443, 7.149890959;
444, 7.355293335; 445, 7.677737058; 446, 8.131301899; 447, 8.704863429;
448, 9.421167533; 449, 10.21262372; 450, 11.09660154; 451, 11.96118407;
452, 12.75440893; 453, 13.45116343; 454, 13.96375243; 455, 14.20217153;
456, 14.1852743; 457, 13.8368643; 458, 13.2837718; 459, 12.51169217;
460, 11.65975216; 461, 10.77712004; 462, 9.969739326; 463, 9.243374226;
464, 8.613017298; 465, 8.08587209; 466, 7.675843026; 467, 7.368134925;
468, 7.085566001; 469, 6.860217368; 470, 6.616172907; 471, 6.364352801;
472, 6.09283932; 473, 5.802795446; 474, 5.51008184; 475, 5.21613722;
476, 4.946964678; 477, 4.70803478; 478, 4.482311948; 479, 4.29295244;
480, 4.152951951; 481, 4.060289127; 482, 4.020927916; 483, 4.0032086;
484, 4.019216675; 485, 4.0610385; 486, 4.137333932; 487, 4.220121949;
488, 4.32326157; 489, 4.439588389; 490, 4.602361046; 491, 4.753973686;
492, 4.937876028; 493, 5.151954338; 494, 5.377030853; 495, 5.634862641;
496, 5.890852923; 497, 6.201075866; 498, 6.511555757; 499, 6.864082982;
500, 7.235156975; 501, 7.62978736; 502, 8.096616934; 503, 8.584850946;
504, 9.069123363; 505, 9.563319438; 506, 10.05732713; 507, 10.62255346;
508, 11.16172848; 509, 11.71150022; 510, 12.26459489; 511, 12.76507563;
512, 13.32048284; 513, 13.8921908; 514, 14.37779509; 515, 14.87652806;
516, 15.29401718; 517, 15.73393281; 518, 16.0881197; 519, 16.37738476;
520, 16.66298615; 521, 16.81982334; 522, 16.90753943; 523, 16.98996529;
524, 16.95429537; 525, 16.89578056; 526, 16.87736403; 527, 16.74743968;
528, 16.58747421; 529, 16.42084468; 530, 16.16573974; 531, 15.97999238;
532, 15.73965741; 533, 15.49614712; 534, 15.18826301; 535, 14.94237956;
536, 14.68245325; 537, 14.40732702; 538, 14.17780463; 539, 13.94165198;
540, 13.734232; 541, 13.52245406; 542, 13.32513337; 543, 13.12101742;
544, 12.94211116; 545, 12.77999817; 546, 12.62662295; 547, 12.4821933;
548, 12.35177497; 549, 12.21991073; 550, 12.08647619; 551, 11.98452482;
552, 11.90825142; 553, 11.81823837; 554, 11.74523699; 555, 11.66722429;
556, 11.60004609; 557, 11.53319817; 558, 11.50226392; 559, 11.42899377;
560, 11.41685611; 561, 11.41582369; 562, 11.43024218; 563, 11.42735896;
564, 11.46659906; 565, 11.48453868; 566, 11.4960408; 567, 11.52142283;
568, 11.56664365; 569, 11.58980425; 570, 11.61547065; 571, 11.67084621;
572, 11.72180551; 573, 11.76755648; 574, 11.82873218; 575, 11.88561655;
576, 12.02230227; 577, 12.04914668; 578, 12.12537132; 579, 12.24252349;
580, 12.30913683; 581, 12.37825032; 582, 12.50464162; 583, 12.59773767;
584, 12.72233224; 585, 12.82786734; 586, 12.87388886; 587, 12.97625691;
588, 13.10585869; 589, 13.21762636; 590, 13.31173478; 591, 13.43644095;
592, 13.54634277; 593, 13.69224625; 594, 13.81960726; 595, 13.95574166;
596, 14.10882655; 597, 14.30497622; 598, 14.44630907; 599, 14.61495672;
600, 14.87107246; 601, 15.08449012; 602, 15.30068156; 603, 15.58451597;
604, 15.86187994; 605, 16.20487429; 606, 16.50361951; 607, 16.92018559;
608, 17.26286027; 609, 17.68946088; 610, 18.12876108; 611, 18.64473908;
612, 19.14451373; 613, 19.70514418; 614, 20.30129329; 615, 20.85780228;
616, 21.43525988; 617, 21.96044347; 618, 22.46147343; 619, 22.89012259;
620, 23.05214788; 621, 23.23966442; 622, 23.09381519; 623, 22.97773561;
624, 22.48085461; 625, 21.92017459; 626, 21.12662955; 627, 20.28861518;
628, 19.37899094; 629, 18.45518315; 630, 17.62095139; 631, 16.72342124;
632, 15.95016577; 633, 15.28844731; 634, 14.67243156; 635, 14.18599657;
636, 13.74806248; 637, 13.36475573; 638, 13.01406488; 639, 12.71729631;
640, 12.46373965; 641, 12.20058203; 642, 11.94480268; 643, 11.78453312;
644, 11.55936197; 645, 11.38567051; 646, 11.23078998; 647, 11.07311068;
648, 10.87315426; 649, 10.6907593; 650, 10.56628731; 651, 10.37654918;
652, 10.2468707; 653, 10.13221104; 654, 9.977966793; 655, 9.790495143;
656, 9.673641681; 657, 9.525438256; 658, 9.336615723; 659, 9.189255488;
660, 9.066462809; 661, 8.921741595; 662, 8.789070779; 663, 8.659671649;
664, 8.503942729; 665, 8.348296548; 666, 8.199182175; 667, 8.062405648;
668, 7.925061398; 669, 7.799759393; 670, 7.683344237; 671, 7.553353471;
672, 7.427152555; 673, 7.285093843; 674, 7.170646368; 675, 7.074476911;
676, 6.901647803; 677, 6.765016355; 678, 6.635779854; 679, 6.512784383;
680, 6.386380242; 681, 6.27638586; 682, 6.14920132; 683, 6.016945916;
684, 5.888819214; 685, 5.765535804; 686, 5.656481795; 687, 5.536624171;
688, 5.402825517; 689, 5.293449339; 690, 5.159820111; 691, 5.06336754;
692, 4.946325593; 693, 4.848210827; 694, 4.722264916; 695, 4.630391613;
696, 4.512755809; 697, 4.413606938; 698, 4.301500227; 699, 4.200315644;
700, 4.111376531; 701, 4.004798914; 702, 3.907295121; 703, 3.810927263;
704, 3.737455746; 705, 3.639137755; 706, 3.553947028; 707, 3.462972203;
708, 3.380352035; 709, 3.285806778; 710, 3.200276766; 711, 3.126856164;
712, 3.038392396; 713, 2.965327761; 714, 2.898351846; 715, 2.813534203;
716, 2.748797225; 717, 2.672765035; 718, 2.605874266; 719, 2.533674744;
720, 2.472109411; 721, 2.405133928; 722, 2.341719859; 723, 2.276779655;
724, 2.217724513; 725, 2.169950708; 726, 2.103022899; 727, 2.052033177;
728, 2.010329956; 729, 1.954223898; 730, 1.892428772; 731, 1.840564485;
732, 1.783799194; 733, 1.745825456; 734, 1.692400804; 735, 1.644251106;
736, 1.600290477; 737, 1.56900072; 738, 1.515950989; 739, 1.479744083;
740, 1.440297933; 741, 1.400521727; 742, 1.354590608; 743, 1.322099695;
744, 1.28661579; 745, 1.251047173; 746, 1.213361805; 747, 1.168943379;
748, 1.142587454; 749, 1.116214413; 750, 1.08327774; 751, 1.046999995;
752, 1.020016414; 753, 0.996289192; 754, 0.965150341; 755, 0.941575862;
756, 0.913523944; 757, 0.888405782; 758, 0.860336748; 759, 0.838220806;
760, 0.81927651; 761, 0.796108913; 762, 0.77080421; 763, 0.747365358;
764, 0.72784432; 765, 0.711749068; 766, 0.689870582; 767, 0.671282254;
768, 0.645129554; 769, 0.63683613; 770, 0.611277287; 771, 0.59703077;
772, 0.582818053; 773, 0.561312651; 774, 0.543589435; 775, 0.529682204;
776, 0.513383294; 777, 0.500714259; 778, 0.487417569; 779, 0.474595791;
780, 0.463096922
]; % 您的原始数据
% 将SPD数据映射到波长范围
spd_uniform(21:421) = spd_data(:,2); % 380nm→索引21,780nm→索引421
% ==============================
% 2. 加载CIE标准数据和D65 SPD
% ==============================
% CIE 1931 2°标准观察者
cie_raw = [ 360, 0.17556, 0.005294, 0.819146;
365, 0.175161, 0.005256, 0.819582;
370, 0.174821, 0.005221, 0.819959;
375, 0.17451, 0.005182, 0.820309;
380, 0.174112, 0.004964, 0.820924;
385, 0.174008, 0.004981, 0.821012;
390, 0.173801, 0.004915, 0.821284;
395, 0.17356, 0.004923, 0.821517;
400, 0.173337, 0.004797, 0.821866;
405, 0.173021, 0.004775, 0.822204;
410, 0.172577, 0.004799, 0.822624;
415, 0.172087, 0.004833, 0.823081;
420, 0.171407, 0.005102, 0.82349;
425, 0.170301, 0.005789, 0.823911;
430, 0.168878, 0.0069, 0.824222;
435, 0.166895, 0.008556, 0.824549;
440, 0.164412, 0.010858, 0.824731;
445, 0.161105, 0.013793, 0.825102;
450, 0.156641, 0.017705, 0.825654;
455, 0.150985, 0.02274, 0.826274;
460, 0.14396, 0.029703, 0.826337;
465, 0.135503, 0.039879, 0.824618;
470, 0.124118, 0.057803, 0.818079;
475, 0.109594, 0.086843, 0.803563;
480, 0.091294, 0.132702, 0.776004;
485, 0.068706, 0.200723, 0.730571;
490, 0.045391, 0.294976, 0.659633;
495, 0.02346, 0.412703, 0.563837;
500, 0.008168, 0.538423, 0.453409;
505, 0.003859, 0.654823, 0.341318;
510, 0.01387, 0.750186, 0.235943;
515, 0.038852, 0.812016, 0.149132;
520, 0.074302, 0.833803, 0.091894;
525, 0.114161, 0.826207, 0.059632;
530, 0.154722, 0.805864, 0.039414;
535, 0.192876, 0.781629, 0.025495;
540, 0.22962, 0.754329, 0.016051;
545, 0.265775, 0.724324, 0.009901;
550, 0.301604, 0.692308, 0.006088;
555, 0.337363, 0.658848, 0.003788;
560, 0.373102, 0.624451, 0.002448;
565, 0.408736, 0.589607, 0.001657;
570, 0.444062, 0.554714, 0.001224;
575, 0.478775, 0.520202, 0.001023;
580, 0.512486, 0.486591, 0.000923;
585, 0.544787, 0.454434, 0.000779;
590, 0.575151, 0.424232, 0.000616;
595, 0.602933, 0.396497, 0.000571;
600, 0.627037, 0.372491, 0.000472;
605, 0.648233, 0.351395, 0.000372;
610, 0.665764, 0.334011, 0.000226;
615, 0.680079, 0.319747, 0.000174;
620, 0.691504, 0.308342, 0.000154;
625, 0.700606, 0.299301, 0.000093;
630, 0.707918, 0.292027, 0.000055;
635, 0.714032, 0.285929, 0.00004;
640, 0.719033, 0.280935, 0.000032;
645, 0.723032, 0.276948, 0.00002;
650, 0.725992, 0.274008, 0;
655, 0.728272, 0.271728, 0;
660, 0.729969, 0.270031, 0;
665, 0.731089, 0.268911, 0;
670, 0.731993, 0.268007, 0;
675, 0.732719, 0.267281, 0;
680, 0.733417, 0.266583, 0;
685, 0.734047, 0.265953, 0;
690, 0.73439, 0.26561, 0;
695, 0.734592, 0.265408, 0;
700, 0.73469, 0.26531, 0;
705, 0.73469, 0.26531, 0;
710, 0.73469, 0.26531, 0;
715, 0.734548, 0.265452, 0;
720, 0.73469, 0.26531, 0;
725, 0.73469, 0.26531, 0;
730, 0.73469, 0.26531, 0;
735, 0.73469, 0.26531, 0;
740, 0.73469, 0.26531, 0;
745, 0.73469, 0.26531, 0;
750, 0.73469, 0.26531, 0;
755, 0.73469, 0.26531, 0;
760, 0.73469, 0.26531, 0;
765, 0.73469, 0.26531, 0;
770, 0.73469, 0.26531, 0;
775, 0.73469, 0.26531, 0;
780, 0.73469, 0.26531, 0;
785, 0.73469, 0.26531, 0;
790, 0.73469, 0.26531, 0;
795, 0.73469, 0.26531, 0;
800, 0.73469, 0.26531, 0;
805, 0.73469, 0.26531, 0;
810, 0.73469, 0.26531, 0;
815, 0.73469, 0.26531, 0;
820, 0.73469, 0.26531, 0;
825, 0.73469, 0.26531, 0;
830, 0.73469, 0.26531, 0 ]; % 您的原始数据
cie_interp = griddedInterpolant(cie_raw(:,1), cie_raw(:,2:4), 'linear', 'nearest');
xyz_interp = cie_interp(wavelength_range);
x_bar = xyz_interp(:,1);
y_bar = xyz_interp(:,2);
z_bar = xyz_interp(:,3);
% 加载D65标准光源SPD (新提供的数据)
d65_data = [
300 , 0.0341 ;
301 , 0.36014 ;
302 , 0.68618 ;
303 , 1.01222 ;
304 , 1.33826 ;
305 , 1.6643 ;
306 , 1.99034 ;
307 , 2.31638 ;
308 , 2.64242 ;
309 , 2.96846 ;
310 , 3.2945 ;
311 , 4.98865 ;
312 , 6.6828 ;
313 , 8.37695 ;
314 , 10.0711 ;
315 , 11.7652 ;
316 , 13.4594 ;
317 , 15.1535 ;
318 , 16.8477 ;
319 , 18.5418 ;
320 , 20.236 ;
321 , 21.9177 ;
322 , 23.5995 ;
323 , 25.2812 ;
324 , 26.963 ;
325 , 28.6447 ;
326 , 30.3265 ;
327 , 32.0082 ;
328 , 33.69 ;
329 , 35.3717 ;
330 , 37.0535 ;
331 , 37.343 ;
332 , 37.6326 ;
333 , 37.9221 ;
334 , 38.2116 ;
335 , 38.5011 ;
336 , 38.7907 ;
337 , 39.0802 ;
338 , 39.3697 ;
339 , 39.6593 ;
340 , 39.9488 ;
341 , 40.4451 ;
342 , 40.9414 ;
343 , 41.4377 ;
344 , 41.934 ;
345 , 42.4302 ;
346 , 42.9265 ;
347 , 43.4228 ;
348 , 43.9191 ;
349 , 44.4154 ;
350 , 44.9117 ;
351 , 45.0844 ;
352 , 45.257 ;
353 , 45.4297 ;
354 , 45.6023 ;
355 , 45.775 ;
356 , 45.9477 ;
357 , 46.1203 ;
358 , 46.293 ;
359 , 46.4656 ;
360 , 46.6383 ;
361 , 47.1834 ;
362 , 47.7285 ;
363 , 48.2735 ;
364 , 48.8186 ;
365 , 49.3637 ;
366 , 49.9088 ;
367 , 50.4539 ;
368 , 50.9989 ;
369 , 51.544 ;
370 , 52.0891 ;
371 , 51.8777 ;
372 , 51.6664 ;
373 , 51.455 ;
374 , 51.2437 ;
375 , 51.0323 ;
376 , 50.8209 ;
377 , 50.6096 ;
378 , 50.3982 ;
379 , 50.1869 ;
380 , 49.9755 ;
381 , 50.4428 ;
382 , 50.91 ;
383 , 51.3773 ;
384 , 51.8446 ;
385 , 52.3118 ;
386 , 52.7791 ;
387 , 53.2464 ;
388 , 53.7137 ;
389 , 54.1809 ;
390 , 54.6482 ;
391 , 57.4589 ;
392 , 60.2695 ;
393 , 63.0802 ;
394 , 65.8909 ;
395 , 68.7015 ;
396 , 71.5122 ;
397 , 74.3229 ;
398 , 77.1336 ;
399 , 79.9442 ;
400 , 82.7549 ;
401 , 83.628 ;
402 , 84.5011 ;
403 , 85.3742 ;
404 , 86.2473 ;
405 , 87.1204 ;
406 , 87.9936 ;
407 , 88.8667 ;
408 , 89.7398 ;
409 , 90.6129 ;
410 , 91.486 ;
411 , 91.6806 ;
412 , 91.8752 ;
413 , 92.0697 ;
414 , 92.2643 ;
415 , 92.4589 ;
416 , 92.6535 ;
417 , 92.8481 ;
418 , 93.0426 ;
419 , 93.2372 ;
420 , 93.4318 ;
421 , 92.7568 ;
422 , 92.0819 ;
423 , 91.4069 ;
424 , 90.732 ;
425 , 90.057 ;
426 , 89.3821 ;
427 , 88.7071 ;
428 , 88.0322 ;
429 , 87.3572 ;
430 , 86.6823 ;
431 , 88.5006 ;
432 , 90.3188 ;
433 , 92.1371 ;
434 , 93.9554 ;
435 , 95.7736 ;
436 , 97.5919 ;
437 , 99.4102 ;
438 , 101.228 ;
439 , 103.047 ;
440 , 104.865 ;
441 , 106.079 ;
442 , 107.294 ;
443 , 108.508 ;
444 , 109.722 ;
445 , 110.936 ;
446 , 112.151 ;
447 , 113.365 ;
448 , 114.579 ;
449 , 115.794 ;
450 , 117.008 ;
451 , 117.088 ;
452 , 117.169 ;
453 , 117.249 ;
454 , 117.33 ;
455 , 117.41 ;
456 , 117.49 ;
457 , 117.571 ;
458 , 117.651 ;
459 , 117.732 ;
460 , 117.812 ;
461 , 117.517 ;
462 , 117.222 ;
463 , 116.927 ;
464 , 116.632 ;
465 , 116.336 ;
466 , 116.041 ;
467 , 115.746 ;
468 , 115.451 ;
469 , 115.156 ;
470 , 114.861 ;
471 , 114.967 ;
472 , 115.073 ;
473 , 115.18 ;
474 , 115.286 ;
475 , 115.392 ;
476 , 115.498 ;
477 , 115.604 ;
478 , 115.711 ;
479 , 115.817 ;
480 , 115.923 ;
481 , 115.212 ;
482 , 114.501 ;
483 , 113.789 ;
484 , 113.078 ;
485 , 112.367 ;
486 , 111.656 ;
487 , 110.945 ;
488 , 110.233 ;
489 , 109.522 ;
490 , 108.811 ;
491 , 108.865 ;
492 , 108.92 ;
493 , 108.974 ;
494 , 109.028 ;
495 , 109.082 ;
496 , 109.137 ;
497 , 109.191 ;
498 , 109.245 ;
499 , 109.3 ;
500 , 109.354 ;
501 , 109.199 ;
502 , 109.044 ;
503 , 108.888 ;
504 , 108.733 ;
505 , 108.578 ;
506 , 108.423 ;
507 , 108.268 ;
508 , 108.112 ;
509 , 107.957 ;
510 , 107.802 ;
511 , 107.501 ;
512 , 107.2 ;
513 , 106.898 ;
514 , 106.597 ;
515 , 106.296 ;
516 , 105.995 ;
517 , 105.694 ;
518 , 105.392 ;
519 , 105.091 ;
520 , 104.79 ;
521 , 105.08 ;
522 , 105.37 ;
523 , 105.66 ;
524 , 105.95 ;
525 , 106.239 ;
526 , 106.529 ;
527 , 106.819 ;
528 , 107.109 ;
529 , 107.399 ;
530 , 107.689 ;
531 , 107.361 ;
532 , 107.032 ;
533 , 106.704 ;
534 , 106.375 ;
535 , 106.047 ;
536 , 105.719 ;
537 , 105.39 ;
538 , 105.062 ;
539 , 104.733 ;
540 , 104.405 ;
541 , 104.369 ;
542 , 104.333 ;
543 , 104.297 ;
544 , 104.261 ;
545 , 104.225 ;
546 , 104.19 ;
547 , 104.154 ;
548 , 104.118 ;
549 , 104.082 ;
550 , 104.046 ;
551 , 103.641 ;
552 , 103.237 ;
553 , 102.832 ;
554 , 102.428 ;
555 , 102.023 ;
556 , 101.618 ;
557 , 101.214 ;
558 , 100.809 ;
559 , 100.405 ;
560 , 100 ;
561 , 99.6334 ;
562 , 99.2668 ;
563 , 98.9003 ;
564 , 98.5337 ;
565 , 98.1671 ;
566 , 97.8005 ;
567 , 97.4339 ;
568 , 97.0674 ;
569 , 96.7008 ;
570 , 96.3342 ;
571 , 96.2796 ;
572 , 96.225 ;
573 , 96.1703 ;
574 , 96.1157 ;
575 , 96.0611 ;
576 , 96.0065 ;
577 , 95.9519 ;
578 , 95.8972 ;
579 , 95.8426 ;
580 , 95.788 ;
581 , 95.0778 ;
582 , 94.3675 ;
583 , 93.6573 ;
584 , 92.947 ;
585 , 92.2368 ;
586 , 91.5266 ;
587 , 90.8163 ;
588 , 90.1061 ;
589 , 89.3958 ;
590 , 88.6856 ;
591 , 88.8177 ;
592 , 88.9497 ;
593 , 89.0818 ;
594 , 89.2138 ;
595 , 89.3459 ;
596 , 89.478 ;
597 , 89.61 ;
598 , 89.7421 ;
599 , 89.8741 ;
600 , 90.0062 ;
601 , 89.9655 ;
602 , 89.9248 ;
603 , 89.8841 ;
604 , 89.8434 ;
605 , 89.8026 ;
606 , 89.7619 ;
607 , 89.7212 ;
608 , 89.6805 ;
609 , 89.6398 ;
610 , 89.5991 ;
611 , 89.4091 ;
612 , 89.219 ;
613 , 89.029 ;
614 , 88.8389 ;
615 , 88.6489 ;
616 , 88.4589 ;
617 , 88.2688 ;
618 , 88.0788 ;
619 , 87.8887 ;
620 , 87.6987 ;
621 , 87.2577 ;
622 , 86.8167 ;
623 , 86.3757 ;
624 , 85.9347 ;
625 , 85.4936 ;
626 , 85.0526 ;
627 , 84.6116 ;
628 , 84.1706 ;
629 , 83.7296 ;
630 , 83.2886 ;
631 , 83.3297 ;
632 , 83.3707 ;
633 , 83.4118 ;
634 , 83.4528 ;
635 , 83.4939 ;
636 , 83.535 ;
637 , 83.576 ;
638 , 83.6171 ;
639 , 83.6581 ;
640 , 83.6992 ;
641 , 83.332 ;
642 , 82.9647 ;
643 , 82.5975 ;
644 , 82.2302 ;
645 , 81.863 ;
646 , 81.4958 ;
647 , 81.1285 ;
648 , 80.7613 ;
649 , 80.394 ;
650 , 80.0268 ;
651 , 80.0456 ;
652 , 80.0644 ;
653 , 80.0831 ;
654 , 80.1019 ;
655 , 80.1207 ;
656 , 80.1395 ;
657 , 80.1583 ;
658 , 80.177 ;
659 , 80.1958 ;
660 , 80.2146 ;
661 , 80.4209 ;
662 , 80.6272 ;
663 , 80.8336 ;
664 , 81.0399 ;
665 , 81.2462 ;
666 , 81.4525 ;
667 , 81.6588 ;
668 , 81.8652 ;
669 , 82.0715 ;
670 , 82.2778 ;
671 , 81.8784 ;
672 , 81.4791 ;
673 , 81.0797 ;
674 , 80.6804 ;
675 , 80.281 ;
676 , 79.8816 ;
677 , 79.4823 ;
678 , 79.0829 ;
679 , 78.6836 ;
680 , 78.2842 ;
681 , 77.4279 ;
682 , 76.5716 ;
683 , 75.7153 ;
684 , 74.859 ;
685 , 74.0027 ;
686 , 73.1465 ;
687 , 72.2902 ;
688 , 71.4339 ;
689 , 70.5776 ;
690 , 69.7213 ;
691 , 69.9101 ;
692 , 70.0989 ;
693 , 70.2876 ;
694 , 70.4764 ;
695 , 70.6652 ;
696 , 70.854 ;
697 , 71.0428 ;
698 , 71.2315 ;
699 , 71.4203 ;
700 , 71.6091 ;
701 , 71.8831 ;
702 , 72.1571 ;
703 , 72.4311 ;
704 , 72.7051 ;
705 , 72.979 ;
706 , 73.253 ;
707 , 73.527 ;
708 , 73.801 ;
709 , 74.075 ;
710 , 74.349 ;
711 , 73.0745 ;
712 , 71.8 ;
713 , 70.5255 ;
714 , 69.251 ;
715 , 67.9765 ;
716 , 66.702 ;
717 , 65.4275 ;
718 , 64.153 ;
719 , 62.8785 ;
720 , 61.604 ;
721 , 62.4322 ;
722 , 63.2603 ;
723 , 64.0885 ;
724 , 64.9166 ;
725 , 65.7448 ;
726 , 66.573 ;
727 , 67.4011 ;
728 , 68.2293 ;
729 , 69.0574 ;
730 , 69.8856 ;
731 , 70.4057 ;
732 , 70.9259 ;
733 , 71.446 ;
734 , 71.9662 ;
735 , 72.4863 ;
736 , 73.0064 ;
737 , 73.5266 ;
738 , 74.0467 ;
739 , 74.5669 ;
740 , 75.087 ;
741 , 73.9376 ;
742 , 72.7881 ;
743 , 71.6387 ;
744 , 70.4893 ;
745 , 69.3398 ;
746 , 68.1904 ;
747 , 67.041 ;
748 , 65.8916 ;
749 , 64.7421 ;
750 , 63.5927 ;
751 , 61.8752 ;
752 , 60.1578 ;
753 , 58.4403 ;
754 , 56.7229 ;
755 , 55.0054 ;
756 , 53.288 ;
757 , 51.5705 ;
758 , 49.8531 ;
759 , 48.1356 ;
760 , 46.4182 ;
761 , 48.4569 ;
762 , 50.4956 ;
763 , 52.5344 ;
764 , 54.5731 ;
765 , 56.6118 ;
766 , 58.6505 ;
767 , 60.6892 ;
768 , 62.728 ;
769 , 64.7667 ;
770 , 66.8054 ;
771 , 66.4631 ;
772 , 66.1209 ;
773 , 65.7786 ;
774 , 65.4364 ;
775 , 65.0941 ;
776 , 64.7518 ;
777 , 64.4096 ;
778 , 64.0673 ;
779 , 63.7251 ;
780 , 63.3828 ;
781 , 63.4749 ;
782 , 63.567 ;
783 , 63.6592 ;
784 , 63.7513 ;
785 , 63.8434 ;
786 , 63.9355 ;
787 , 64.0276 ;
788 , 64.1198 ;
789 , 64.2119 ;
790 , 64.304 ;
791 , 63.8188 ;
792 , 63.3336 ;
793 , 62.8484 ;
794 , 62.3632 ;
795 , 61.8779 ;
796 , 61.3927 ;
797 , 60.9075 ;
798 , 60.4223 ;
799 , 59.9371 ;
800 , 59.4519 ;
801 , 58.7026 ;
802 , 57.9533 ;
803 , 57.204 ;
804 , 56.4547 ;
805 , 55.7054 ;
806 , 54.9562 ;
807 , 54.2069 ;
808 , 53.4576 ;
809 , 52.7083 ;
810 , 51.959 ;
811 , 52.5072 ;
812 , 53.0553 ;
813 , 53.6035 ;
814 , 54.1516 ;
815 , 54.6998 ;
816 , 55.248 ;
817 , 55.7961 ;
818 , 56.3443 ;
819 , 56.8924 ;
820 , 57.4406 ;
821 , 57.7278 ;
822 , 58.015 ;
823 , 58.3022 ;
824 , 58.5894 ;
825 , 58.8765 ;
826 , 59.1637 ;
827 , 59.4509 ;
828 , 59.7381 ;
829 , 60.0253 ;
830 , 60.3125 ;
]; % 替换为您的D65数据
d65_interp = griddedInterpolant(d65_data(:,1), d65_data(:,2), 'linear', 'nearest');
d65_spd = d65_interp(wavelength_range);
% ==============================
% 3. 计算CIEXYZ & 色品坐标
% ==============================
delta_lambda = 1.0;
k = 100 / sum(spd_uniform .* y_bar * delta_lambda);
X = k * sum(spd_uniform .* x_bar * delta_lambda);
Y = k * sum(spd_uniform .* y_bar * delta_lambda);
Z = k * sum(spd_uniform .* z_bar * delta_lambda);
x = X / (X + Y + Z);
y = Y / (X + Y + Z);
% ==============================
% 4. CCT & Duv计算 (Robertson方法)
% ==============================
% 转换到CIE 1960 UCS
u = 4*X / (X + 15*Y + 3*Z);
v = 6*Y / (X + 15*Y + 3*Z);
% 黑体辐射轨迹参数
T_range = 1000:1:20000; % 温度范围(K)
min_dist = inf;
cct_est = 6500; % 初始估计值
% 预计算黑体轨迹
c1 = 3.74183e-16; % W.m^2
c2 = 1.4388e-2; % m.K
lambda_m = wavelength_range * 1e-9; % 转换为米
% 遍历温度寻找最近点
for T = T_range
% 普朗克辐射公式
spd_bb = c1 ./ (lambda_m.^5 .* (exp(c2./(lambda_m*T)) - 1));
% 归一化
k_bb = 100 / sum(spd_bb .* y_bar * delta_lambda);
X_bb = k_bb * sum(spd_bb .* x_bar * delta_lambda);
Y_bb = k_bb * sum(spd_bb .* y_bar * delta_lambda);
Z_bb = k_bb * sum(spd_bb .* z_bar * delta_lambda);
% 转换到CIE 1960 UCS
u_bb = 4*X_bb/(X_bb + 15*Y_bb + 3*Z_bb);
v_bb = 6*Y_bb/(X_bb + 15*Y_bb + 3*Z_bb);
% 计算距离
dist = sqrt((u - u_bb)^2 + (v - v_bb)^2);
if dist < min_dist
min_dist = dist;
cct_est = T;
u_bb_min = u_bb;
v_bb_min = v_bb;
end
end
%McAamy公式计算CCT
n = (u - 0.3320) / (v - 0.1858);
CCT = -449 * n^3 + 3525 * n^2 - 6823.3 * n + 5520.33;
% 计算Duv (基于黑体轨迹的垂直距离)
%CCT = cct_est;
Duv = sign(v - v_bb_min) * min_dist; % 带符号的Duv
% ==============================
% 5. mel-DER计算 (使用D65参考)
% ==============================
% 褪黑素敏感度函数 (CIE S 026/E:2018)
mel_lambda = (360:10:830)';
mel_response = [ 0.0000, 0.0001, 0.0004, 0.0008, 0.0015, 0.0030, 0.0061, 0.0110, 0.0177, 0.0259,...
0.0351, 0.0450, 0.0560, 0.0660, 0.0750, 0.0820, 0.0880, 0.0920, 0.0950, 0.0960,...
0.0970, 0.0960, 0.0930, 0.0890, 0.0840, 0.0780, 0.0720, 0.0650, 0.0580, 0.0510,...
0.0450, 0.0390, 0.0330, 0.0280, 0.0230, 0.0190, 0.0150, 0.0120, 0.0090, 0.0070,...
0.0050, 0.0040, 0.0030, 0.0022, 0.0015, 0.0010, 0.0007, 0.0005 ]; % 您的原始数据
mel_interp = griddedInterpolant(mel_lambda, mel_response, 'linear', 'nearest');
mel_curve = mel_interp(wavelength_range);
% 归一化D65到Y=100
k_d65 = 100 / sum(d65_spd .* y_bar * delta_lambda);
d65_spd_normalized = d65_spd * k_d65;
% 计算褪黑素照度
E_mel_test = sum(spd_uniform .* mel_curve * delta_lambda);
E_mel_d65 = sum(d65_spd_normalized .* mel_curve * delta_lambda);
mel_DER = E_mel_test / E_mel_d65; % 相对于D65的比值
% ==============================
% 6. Rf & Rg计算 (使用D65参考)
% ==============================
% 加载TM-30测试色样反射率
% tm30_reflectances = dlmread('tm30_test_samples.csv'); % 99个色样反射率
% 此处简化: 使用随机反射率矩阵模拟
tm30_reflectances = rand(length(wavelength_range), 99);
% 根据CCT选择参考光源
if CCT < 5000
% 生成黑体辐射参考光源
spd_bb = c1 ./ (lambda_m.^5 .* (exp(c2./(lambda_m*CCT)) - 1));
k_bb = 100 / sum(spd_bb .* y_bar * delta_lambda);
ref_spd = spd_bb * k_bb;
else
ref_spd = d65_spd_normalized; % CCT≥5000K用D65
end
% 初始化变量
de_sum = 0;
test_points = [];
ref_points = [];
% 遍历99个测试色样
for i = 1:99
refl = tm30_reflectances(:, i);
% 测试光源下色样XYZ
X_test = sum(spd_uniform .* refl .* x_bar) * delta_lambda;
Y_test = sum(spd_uniform .* refl .* y_bar) * delta_lambda;
Z_test = sum(spd_uniform .* refl .* z_bar) * delta_lambda;
% 参考光源下色样XYZ
X_ref = sum(ref_spd .* refl .* x_bar) * delta_lambda;
Y_ref = sum(ref_spd .* refl .* y_bar) * delta_lambda;
Z_ref = sum(ref_spd .* refl .* z_bar) * delta_lambda;
% 转换为CIELAB
Lab_test = xyz2lab([X_test, Y_test, Z_test]);
Lab_ref = xyz2lab([X_ref, Y_ref, Z_ref]);
% 计算CIEDE2000色差
de = ciede2000(Lab_test, Lab_ref);
de_sum = de_sum + de;
end
% 计算Rf
Rf = 100 - 4.6 * (de_sum / 99); % TM-30缩放因子
% 简化Rg计算 (实际需要凸包面积)
Rg = 100 * (1 + 0.01*(rand()-0.5)); % 随机值模拟
% ==============================
% 7. 输出计算结果
% ==============================
fprintf("\n%40s\n", repmat('=',1,40));
fprintf("CCT ≈ %.2f K\n", CCT);
fprintf("Duv ≈ %.6f\n", Duv);
fprintf("mel-DER (vs D65) ≈ %.4f\n", mel_DER);
fprintf("Rf ≈ %.2f\n", Rf);
fprintf("Rg ≈ %.2f\n", Rg);
fprintf("%40s\n", repmat('=',1,40));
% ==============================
% 8. 可视化结果
% ==============================
figure('Position', [100, 100, 900, 500]);
plot(wavelength_range, spd_uniform, 'LineWidth', 2); hold on;
plot(wavelength_range, d65_spd_normalized, 'LineWidth', 2);
plot(wavelength_range, mel_curve * max(spd_uniform), '--', 'LineWidth', 1.5);
xlabel('波长 (nm)');
ylabel('相对功率');
title('SPD、D65参考与褪黑素敏感度曲线');
legend('测试光源SPD', 'D65参考光源', '褪黑素敏感度曲线(缩放)');
grid on;
saveas(gcf, './SPD_D65_褪黑素曲线.jpg');
% ==============================
% 辅助函数定义
% ==============================
function Lab = xyz2lab(XYZ)
% XYZ转CIELAB (D65白点)
Xn = 95.047; Yn = 100.0; Zn = 108.883;
X = XYZ(1)/Xn; Y = XYZ(2)/Yn; Z = XYZ(3)/Zn;
f = @(t) (t > (6/29)^3) .* t.^(1/3) + ...
(t <= (6/29)^3) .* ((1/3)*(29/6)^2*t + 4/29);
L = 116 * f(Y) - 16;
a = 500 * (f(X) - f(Y));
b = 200 * (f(Y) - f(Z));
Lab = [L, a, b];
end
function de00 = ciede2000(lab1, lab2)
% 简化的CIEDE2000色差计算
% 实际实现需要完整公式,此处为简化版
L1 = lab1(1); a1 = lab1(2); b1 = lab1(3);
L2 = lab2(1); a2 = lab2(2); b2 = lab2(3);
% 简化的欧氏距离作为近似
de00 = sqrt((L1-L2)^2 + (a1-a2)^2 + (b1-b2)^2);
end
在这段代码中结果为CCT ≈ 9961.48 K
Duv ≈ 0.051560
mel-DER (vs D65) ≈ 14.6299
Rf ≈ -590.09
Rg ≈ 100.45 答案除DUV和Rg偏差不大外埼玉都有很大的误差,在此基础上重新修改代码
最新发布