Дискретная свёртка с промежуточными точками

Рейтинг: 3Ответов: 0Опубликовано: 25.07.2023

Я интерполирую сигнал с помощью свёртки с функцией кардинального синуса. Формула интерполяции:

введите сюда описание изображения

Здесь x(t) - исходный сигнал, hs(t) - функция кардинального синуса, x^(t) - интерполированный сигнал. Формула, в принципе, понятна, и я набросал её наивную реализацию, которая между каждыми двумя соседними точками сигнала вставляет numValuesToInsert новых точек:

import numpy as np
import matplotlib.pyplot as plt
from scipy import signal

def interpolate_hard(time, samples, numValuesToInsert = 3):
    samplingPeriod = time[1] - time[0]
    N = samples.size
    iTime = np.linspace(time[0], time[-1], time.size * (numValuesToInsert + 1) - numValuesToInsert)
    iSamples = np.empty(samples.size * (numValuesToInsert + 1) - numValuesToInsert)
    iSamplingPeriod = iTime[1] - iTime[0]
    
    for j in range(iSamples.size):
        summ = 0
        for i in range(0, N):            
            summ += samples[i] * np.sinc((j * iSamplingPeriod - i*samplingPeriod) / samplingPeriod)
        iSamples[j] = summ
    return iTime, iSamples

samples = np.array([0.02463, 0.11107, 0.22659, 0.27451, 0.17808, -0.07051, -0.41178, -0.75116, -0.98205, -1.0257, -0.8773, -0.6021, -0.30154, -0.06442, 0.08611, 0.1938, 0.33872, 0.59051, 0.98102, 1.51593, 2.15984, 2.78196, 3.15713, 3.07422, 2.42536, 1.24996, -0.27762, -1.91811, -3.39176, -4.44633, -4.94513, -4.8844, -4.39088, -3.63353, -2.74111, -1.80521, -0.83655, 0.229, 1.44554, 2.80646, 4.21961, 5.50067, 6.40278, 6.69, 6.20554, 4.90547, 2.9173, 0.55879, -1.79256, -3.80937, -5.25163, -6.02999, -6.18016, -5.78575, -4.97589, -3.89464, -2.65637, -1.29684, 0.22418, 1.91521, 3.71543, 5.4786, 6.94698, 7.82051, 7.87678, 7.03643, 5.36419, 3.05524, 0.41419, -2.21788, -4.53591, -6.28681, -7.34791, -7.73723, -7.50724, -6.72628, -5.49016, -3.87737, -1.94811, 0.2052, 2.47964, 4.72682, 6.7114, 8.16833, 8.84068, 8.57557, 7.39706, 5.45901, 3.00372, 0.35264, -2.18094, -4.39346, -6.16812, -7.42778, -8.12701, -8.21951, -7.66299, -6.47108, -4.69, -2.40592, 0.2053, 2.93061, 5.53068, 7.72455, 9.23357, 9.808, 9.31417, 7.82527, 5.63166, 3.10247, 0.49524, -2.02572, -4.31975, -6.24976, -7.719, -8.6894, -9.11307, -8.94084, -8.12764, -6.63534, -4.50762, -1.90758, 0.92058, 3.68271, 6.0833, 7.87973, 8.86084, 8.90467, 8.05401, 6.47229, 4.40478, 2.12242, -0.13964, -2.21573, -4.02347, -5.51454, -6.64151, -7.33752, -7.50584, -7.06574, -5.97883, -4.26084, -2.03279, 0.45834, 2.91328, 5.05508, 6.64767, 7.55231, 7.75245, 7.30741, 6.31684, 4.9197, 3.26519, 1.4694, -0.35853, -2.12444, -3.75255, -5.16108, -6.24805, -6.8846, -6.93824, -6.31191, -5.0136, -3.18827, -1.0745, 1.0803, 3.04777, 4.60895, 5.59684, 5.96636, 5.77567, 5.1153, 4.0866, 2.78749, 1.32877, -0.18181, -1.67363, -3.08094, -4.29823, -5.1815, -5.60221, -5.47852, -4.78966, -3.6033, -2.05888, -0.35036, 1.31425, 2.76353, 3.86519, 4.57303, 4.92238, 4.94543, 4.66925, 4.1398, 3.38535, 2.42061, 1.27527, 0.00979, -1.27797, -2.47702, -3.45475, -4.10302, -4.38857, -4.32689, -3.96161, -3.34917, -2.54825, -1.63773, -0.70101, 0.23324, 1.17248, 2.12073, 3.05493, 3.88855, 4.48035, 4.69438, 4.43592, 3.6693, 2.47215, 1.00798, -0.54821, -2.03165, -3.30009, -4.23891, -4.8109, -5.05421, -4.99979, -4.67114, -4.08497, -3.22753, -2.1172, -0.81469, 0.62415, 2.12727, 3.57067, 4.78627, 5.64507, 6.07912, 6.03971, 5.51922, 4.58504, 3.36819, 2.00081, 0.55345, -0.94773, -2.45689, -3.89611, -5.17563, -6.18272, -6.77713, -6.84036, -6.27877, -5.04773, -3.23531, -1.05086, 1.24311, 3.40232, 5.24221, 6.60814, 7.40348, 7.6257, 7.3051, 6.53821, 5.47696, 4.16885, 2.5932, 0.78841, -1.17494, -3.21371, -5.19599, -6.94861, -8.2904, -9.0531, -9.09296, -8.34448, -6.87017, -4.82878, -2.422, 0.11763, 2.56175, 4.75623, 6.60733, 8.04263, 8.98513, 9.33806, 9.02676, 8.02201, 6.3251, 4.00501, 1.23897, -1.69815, -4.49919, -6.89225, -8.65367, -9.63577, -9.75163, -8.98449, -7.43576, -5.2934, -2.77945, -0.11479, 2.50214, 4.90611, 6.94373, 8.48393, 9.42212, 9.63085, 9.00597, 7.54164, 5.34165, 2.61548, -0.35912, -3.29025, -5.90616, -7.97414, -9.30812, -9.79341, -9.41921, -8.26365, -6.45123, -4.14699, -1.52439, 1.25511, 4.00394, 6.51258, 8.5541, 9.91338, 10.4283, 9.98495, 8.55918, 6.25776, 3.28113, -0.08377, -3.47642, -6.52705, -8.92137, -10.43437, -10.91756, -10.3328, -8.76215, -6.35263, -3.30091, 0.16086, 3.77723, 7.22985, 10.1442, 12.17316, 13.06973, 12.69673, 11.02195, 8.12942, 4.23947, -0.26785, -4.92821, -9.27174, -12.84689, -15.28235, -16.29219, -15.71986, -13.60139, -10.08639, -5.42807, -0.04082, 5.5545, 10.8236, 15.25205, 18.36353, 19.77648, 19.22914, 16.63234, 12.1584, 6.22018, -0.58993, -7.57948, -14.03879, -19.29297, -22.7794, -24.08381, -22.99684, -19.57754, -14.11621, -7.0891, 0.86286, 8.98788, 16.51616, 22.71817, 26.93614, 28.66996, 27.66322, 23.93148, 17.75267, 9.66005, 0.41276, -9.09361, -17.91946, -25.19101, -30.18519, -32.36649, -31.46473, -27.52081, -20.85934, -12.04399, -1.85139, 8.76566, 18.79184, 27.24923, 33.279, 36.22859, 35.70909, 31.67798, 24.4554, 14.94454, 4.38805, -6.42926, -17.00445, -26.66146, -34.61163, -40.07558, -42.43019, -41.30734, -36.65335, -28.75885, -18.24299, -6.01147, 6.82182, 19.07688, 29.64977, 37.56691, 42.07921, 42.77102, 39.56895, 32.73809, 22.87108, 10.87373, -2.12379, -14.91695, -26.35005, -35.41096, -41.27456, -43.38462, -41.55104, -35.9236, -26.96716, -15.4648, -2.43912, 10.91923, 23.36084, 33.72362, 41.03774, 44.61971, 44.12602, 39.57693, 31.35966, 20.19423, 7.10453, -6.67851, -19.87007, -31.2545, -39.80261, -44.74927, -45.66384, -42.48463, -35.47894, -25.23558, -12.67789, 1.03517, 14.66628, 26.97847, 36.83224, 43.33352, 45.89944, 44.26772, 38.54464, 29.24718, 17.26355, 3.74336, -10.04421, -22.83303, -33.45895, -40.95917, -44.66204, -44.23771, -39.71979, -31.53203, -20.44146, -7.47144, 6.15182, 19.15032, 30.34047, 38.68808, 43.42558, 44.14632, 40.80171, 33.71346, 23.5692, 11.30985, -1.96386, -15.03925, -26.70582, -35.89829, -41.79387, -43.84758, -41.86023, -36.03493, -26.92257, -15.35443, -2.39814, 10.71694, 22.73497, 32.53238, 39.22596, 42.21499, 41.2282, 36.39381, 28.21813, 17.48603, 5.19759, -7.51623, -19.50708, -29.65523, -36.99336, -40.86523, -40.91774, -37.14003, -29.90287, -19.8957, -8.08163, 4.4062, 16.39361, 26.77253, 34.58426, 39.12927, 40.03308, 37.2543, 31.10595, 22.20887, 11.43308, -0.21168, -11.70558, -22.04923, -30.30485, -35.71383, -37.79973, -36.40317, -31.67182, -24.04865, -14.26037, -3.23313, 8.00296, 18.38221, 26.92225, 32.83745, 35.61308, 35.02381, 31.46114, 25.77631, 18.44974, 9.7629, 0.24264, -9.43759, -18.50769, -26.16538, -31.69247, -34.54195, -34.39867, -31.24271, -25.35873, -17.26254, -7.68278, 2.47109, 12.24463, 20.72546, 27.14128, 30.9796, 31.98566, 30.1358, 25.64775, 18.96308, 10.73917, 1.7737, -7.12888, -15.21462, -21.78535, -26.27017, -28.30577, -27.74011, -24.6631, -19.37686, -12.35665, -4.28401, 4.02739, 11.78827, 18.32659, 23.08322, 25.62273, 25.72635, 23.45178, 19.09305, 13.10819, 6.05907, -1.38607, -8.51095, -14.68984, -19.41378, -22.2703, -22.99551, -21.56503, -18.20105, -13.30307, -7.3883, -1.04388, 5.1338, 10.60144, 14.92621, 17.78507, 18.9536, 18.36334, 16.1213, 12.50457, 7.9156, 2.79343, -2.41928, -7.27198, -11.30453, -14.12082, -15.50133, -15.3801, -13.81572, -11.01065, -7.25947, -2.93309, 1.53851, 5.73176, 9.26872, 11.83644, 13.21696, 13.32079, 12.17006, 9.90181, 6.75875, 3.04854, -0.83807, -4.49828, -7.61095, -9.91157, -11.19615, -11.36685, -10.44928, -8.56625, -5.93681, -2.89085, 0.20683, 3.05539, 5.42255, 7.11597, 8.03581, 8.17291, 7.54959, 6.25433, 4.4564, 2.33287, 0.07278, -2.09694, -3.97331, -5.41254, -6.29636, -6.50905, -6.02173, -4.93507, -3.39396, -1.55592, 0.40476, 2.29609, 3.90967, 5.07221, 5.67351, 5.67725, 5.12019, 4.07993, 2.67593, 1.06589, -0.5847, -2.12196, -3.41422, -4.33166, -4.75836, -4.64755, -4.02376, -2.95243, -1.56672, -0.05246, 1.44004, 2.77227, 3.80189, 4.44752, 4.64826, 4.337, 3.52339, 2.33666, 0.96608, -0.45518, -1.86574, -3.20472, -4.36825, -5.21193, -5.60558, -5.4651, -4.76734, -3.57778, -2.00929, -0.21713, 1.58374, 3.21249, 4.52683, 5.37271, 5.65332, 5.36551, 4.53872, 3.21931, 1.5333, -0.3327, -2.19819, -3.87959, -5.18485, -5.96038, -6.11569, -5.6076, -4.45059, -2.74201, -0.66932, 1.51911, 3.58694, 5.35308, 6.66323, 7.36996, 7.36919, 6.6427, 5.22625, 3.20961, 0.78036, -1.83289, -4.37444, -6.57274, -8.19794, -9.04358, -8.96239, -7.9315, -6.03056, -3.41838, -0.3601, 2.7913, 5.71347, 8.13445, 9.79046, 10.49794, 10.16481, 8.76373, 6.38327, 3.24769, -0.33373, -4.00583, -7.37128, -10.04628, -11.71767, -12.17073, -11.32104, -9.22098, -6.05022, -2.12204, 2.12603, 6.22398, 9.75302, 12.36674, 13.79686, 13.89837, 12.68931, 10.28518, 6.8493, 2.65653, -1.90361, -6.4103, -10.44047, -13.58677, -15.4915, -15.88706, -14.6609, -11.90433, -7.87293, -2.94624, 2.35968, 7.472, 11.88901, 15.20172, 17.07317, 17.29267, 15.82095, 12.77614, 8.43431, 3.21427, -2.39497, -7.8853, -12.7624, -16.56441, -18.87009, -19.37365, -17.96818, -14.77673, -10.09936, -4.36345, 1.86976, 7.98832, 13.40971, 17.60209, 20.14144, 20.76037, 19.38695, 16.17373, 11.44401, 5.64231, -0.68301, -6.97451, -12.69947, -17.31884, -20.3428, -21.43362, -20.45325, -17.44788, -12.66977, -6.59472, 0.16307, 6.9412, 13.08852, 18.02492, 21.29525, 22.58984, 21.76725, 18.90079, 14.23641, 8.17471, 1.26936, -5.86278, -12.62718, -18.50153, -23.05883, -25.92288, -26.76079, -25.39733, -21.89359, -16.52219, -9.73144, -2.13086, 5.58281, 12.70381, 18.56578, 22.64124, 24.58839, 24.23666, 21.63491, 17.05918, 10.94569, 3.859, -3.54002, -10.57242, -16.61513, -21.11583, -23.61965, -23.87428, -21.87402, -17.81291, -12.06126, -5.18322, 2.12087, 9.16146, 15.32353, 20.0487, 22.89268, 23.62283, 22.23208, 18.8758, 13.84212, 7.57007, 0.621, -6.37532, -12.78496, -18.00931, -21.55481, -23.08968, -22.43785, -19.6338, -14.95978, -8.89483, -2.03972, 4.94072, 11.38353, 16.69222, 20.39415, 22.16312, 21.81883, 19.38593, 15.10982, 9.39521, 2.80237, -4.01983, -10.45714, -15.92765, -19.8772, -21.87232, -21.6942, -19.37462, -15.16854, -9.49073, -2.91086, 3.88951, 10.2525, 15.59945, 19.4323, 21.40029, 21.3507, 19.31554, 15.48528, 10.22648, 4.07522, -2.35754, -8.4755, -13.72538, -17.60994, -19.76429, -19.98921, -18.27975, -14.84812, -10.06692, -4.41885, 1.54472, 7.2604, 12.21295, 15.9672, 18.20414, 18.73152, 17.47768, 14.54992, 10.25229, 5.00318, -0.70147, -6.29351, -11.21688, -15.02688, -17.39037, -18.07488, -17.00592, -14.31095, -10.27696, -5.30888, 0.08257, 5.37272, 10.08007, 13.79681, 16.20016, 17.05079, 16.25764, 13.90264, 10.21413, 5.56086, 0.40991, -4.75788, -9.4514, -13.22167, -15.71423, -16.66699, -15.99839, -13.79393, -10.25693, -5.74085, -0.70484, 4.37284, 9.0495, 12.89838, 15.51985, 16.64405, 16.15585, 14.09484, 10.81248, 6.83985, 2.49403, -2.04465, -6.49976, -10.51439, -13.71784, -15.76756, -16.44578, -15.70591, -13.61008, -10.32967, -6.1595, -1.48964, 3.24566, 7.62812, 11.26572, 13.79641, 14.96131, 14.66365, 12.96405, 10.06213, 6.27162, 1.99402, -2.35541, -6.4185, -9.85792, -12.35754, -13.69456, -13.74952, -12.52683, -10.15504, -6.82554, -2.82297, 1.44088, 5.51741, 9.00451, 11.59257, 13.08338, 13.36596, 12.418, 10.32252, 7.29233, 3.64745, -0.25843, -4.06136, -7.40239, -9.96095, -11.52067, -11.97449, -11.26776, -9.45692, -6.73437, -3.38079, 0.24778, 3.75997, 6.80611, 9.12094, 10.49205, 10.78474, 9.99871, 8.24006, 5.71839, 2.73485, -0.40801, -3.43665, -6.09743, -8.17385, -9.49329, -9.92686, -9.40954, -7.97086, -5.74417, -2.93748, 0.1917, 3.33184, 6.14465, 8.30887, 9.59451, 9.89902, 9.20745, 7.60882, 5.29591, 2.50558, -0.49721, -3.40724, -5.92491, -7.83277, -8.96017, -9.18169, -8.48569, -6.93084, -4.63747, -1.82536, 1.19754, 4.10007, 6.59417, 8.42177, 9.36844, 9.34131, 8.37985, 6.57549, 4.0915, 1.21727, -1.73424, -4.49122, -6.78438, -8.39715, -9.21561, -9.17483, -8.24611, -6.49946, -4.10731, -1.28738, 1.71191, 4.59867, 7.05869, 8.81979, 9.68681, 9.53062, 8.32424, 6.20401, 3.41675, 0.25216, -2.97787, -5.97874, -8.44608, -10.09958, -10.75044, -10.30875, -8.80283, -6.35478, -3.18089, 0.3926, 4.00482, 7.30934, 9.97801, 11.72617, 12.34823, 11.75623, 10.0902, 7.66425, 4.67036, 1.25662, -2.32242, -5.79713, -8.86608, -11.2135, -12.59531, -12.85971, -11.95056, -9.92474, -6.95147, -3.30089, 0.67283, 4.57472, 8.04849, 10.79653, 12.53694, 13.04978, 12.27298, 10.29588, 7.31567, 3.62499, -0.42968, -4.47864, -8.14984, -11.10647, -13.06634, -13.83289, -13.30564, -11.5017, -8.58188, -4.80318, -0.50501, 3.90726, 8.00347, 11.35613, 13.63075, 14.60698, 14.15561, 12.31407, 9.29135, 5.38017, 0.9446, -3.56991, -7.71226, -11.09704, -13.41672, -14.44144, -14.03587, -12.20934, -9.13218, -5.10505, -0.52755, 4.13069, 8.40373, 11.87374, 14.19336, 15.14153, 14.62043, 12.66606, 9.46616, 5.33149, 0.66628, -4.0836, -8.49089, -12.15711, -14.71591, -15.8812, -15.51777, -13.64477, -10.42255, -6.15546, -1.25465, 3.79499, 8.48689, 12.35121, 15.01135, 16.20916, 15.80857, 13.83505, 10.48371, 6.0828, 1.05852, -4.12077, -8.95794, -12.93808, -15.63547, -16.79443, -16.31256, -14.21533, -10.67739, -6.02079, -0.69934, 4.74843, 9.78554, 13.90426, 16.66461, 17.7851, 17.1576, 14.8393, 11.08082, 6.25035, 0.80056, -4.73522, -9.82716, -13.97512, -16.7709, -17.95173, -17.39376, -15.14374, -11.42142, -6.57938, -1.06551, 4.60924, 9.89662, 14.2551, 17.22521, 18.49192, 17.93296, 15.60458, 11.71531, 6.66891, 0.9973, -4.76664, -10.11738, -14.56654, -17.65963, -19.05684, -18.59548, -16.31043, -12.42724, -7.31438, -1.46489, 4.55182, 10.15133, 14.77305, 17.97536, 19.48178, 19.14347, 17.15021, 13.95285, 9.77177, 4.7394, -0.80746, -6.41626, -11.60866, -15.91312, -18.88407, -20.18491, -19.65231, -17.29372, -13.29356, -8.02422, -2.00964, 4.16114, 9.89283, 14.64502, 17.98855, 19.62881, 19.4313, 17.4214, 13.79312, 8.89775, 3.22156, -2.69042, -8.31111, -13.15164, -16.79454, -18.88227, -19.1782, -17.66572, -14.51289, -10.03279, -4.6697, 1.04677, 6.56272, 11.38866, 15.12249, 17.43025, 18.07693, 16.98476, 14.27777, 10.26436, 5.35931, 0.02584, -5.23973, -9.94523, -13.64951, -16.01052, -16.80484, -15.95241, -13.56681, -9.89277, -5.27996, -0.20592, 4.82111, 9.32427, 12.8928, 15.22118, 16.09805, 15.43935, 13.32063, 9.95629, 5.67333, 0.88428, -3.96239, -8.41585, -12.04365, -14.49174, -15.51327, -15.00015, -13.01323, -9.73469, -5.47649, -0.67261, 4.21148, 8.68778, 12.27805, 14.60633, 15.44519, 14.72918, 12.54704, 9.09721, 4.69912, -0.18712, -5.06123, -9.44774, -12.90853, -15.09596, -15.7763, -14.85738, -12.41607, -8.67375, -4.01636, 1.05882, 6.03582, 10.41352, 13.7738, 15.79024, 16.24892, 15.09939, 12.44474, 8.54523, 3.80492, -1.29985, -6.27111, -10.62213, -13.94564, -15.92278, -16.34451, -15.16309, -12.48277, -8.53927, -3.69891, 1.53015, 6.60356, 11.05784, 14.47511, 16.48172, 16.86632, 15.6109, 12.81683, 8.72199, 3.72233, -1.70443, -7.05331, -11.8032, -15.47458, -17.68504, -18.17356, -16.87718, -13.93344, -9.63758, -4.42547, 1.19976, 6.71905, 11.6055, 15.3794, 17.66158, 18.36844, 17.70287, 15.75105, 12.54432, 8.27465, 3.26201, -2.05341, -7.20167, -11.71643, -15.15484, -17.20588, -17.69392, -16.54302, -13.84384, -9.85329, -4.92875, 0.47267, 5.82897, 10.63011, 14.44823, 16.94756, 17.88145, 17.15561, 14.82697, 11.08805, 6.29339, 0.93503, -4.45988, -9.4194, -13.50236, -16.3052, -17.56083, -17.16076, -15.12823, -11.63822, -7.01461, -1.68921, 3.83385, 9.00686, 13.30956, 16.31428, 17.71641, 17.36547, 15.26875, 11.62734, 6.83885, 1.4305, -4.04363, -9.09232, -13.26174, -16.14086, -17.43444, -16.996, -14.88249, -11.3428, -6.7181, -1.44587, 3.94699, 8.95578, 13.13903, 16.0879, 17.47838, 17.16843, 15.18995, 11.75135, 7.22176, 2.03164, -3.31974, -8.29122, -12.41872, -15.33077, -16.74882, -16.52752, -14.69072, -11.43673, -7.07502, -2.00145, 3.30071, 8.31803, 12.54465, 15.52921, 16.97179, 16.74344, 14.85645, 11.48172, 6.94364, 1.67723, -3.80877, -8.96172, -13.23204, -16.17544, -17.5047, -17.08104, -14.9435, -11.33394, -6.64298, -1.31324, 4.17543, 9.29387, 13.5351, 16.48022, 17.82977, 17.43567, 15.3058, 11.64058, 6.8363, 1.39397, -4.17111, -9.36108, -13.68845, -16.69547, -18.03682, -17.56808, -15.35515, -11.63455, -6.77256, -1.22752, 4.48214, 9.80327, 14.19147, 17.18593, 18.47131, 17.92574, 15.6062, 11.72216, 6.65363, 0.92081, -4.89745, -10.24371, -14.60379, -17.56516, -18.86695, -18.36626, -16.07989, -12.2186, -7.16426, -1.43902, 4.40106, 9.83412, 14.36123, 17.52196, 18.97387, 18.75098, 17.16214, 14.33269, 10.31329, 5.35051, -0.14035, -5.65766, -10.69676, -14.80079, -17.5624, -18.69374, -18.10646, -15.86692, -12.15361, -7.29418, -1.7732, 3.87707, 9.14781, 13.56995, 16.74479, 18.38038, 18.30303, 16.47736, 13.05412, 8.35625, 2.8535, -2.89211, -8.29324, -12.80497, -16.01114, -17.63954, -17.58154, -15.88799, -12.7263, -8.3922, -3.30417, 2.03662, 7.10344, 11.43057, 14.6599, 16.53402, 16.88216, 15.62764, 12.8571, 8.82186, 3.89787, -1.40165, -6.53057, -11.00116, -14.38467, -16.35504, -16.73007, -15.48226, -12.73013, -8.74322, -3.93026, 1.23105, 6.24346, 10.62223, 13.9626, 15.97296, 16.48384, 15.44142, 12.91673, 9.14827, 4.50214, -0.5648, -5.53621, -9.91046, -13.24432, -15.22296, -15.66529, -14.51405, -11.91603, -8.17694, -3.66899, 1.18257, 5.93751, 10.14059, 13.34769, 15.23906, 15.65137, 14.5325, 11.95235, 8.14666, 3.50267, -1.51376, -6.41021, -10.70204, -13.95705, -15.84215, -16.19123, -14.98072, -12.30069, -8.39993, -3.67318, 1.38574, 6.27139, 10.54569, 13.83008, 15.79481, 16.22161, 15.05538, 12.39491, 8.49677, 3.76207, -1.33508, -6.32285, -10.72808, -14.09875, -16.08947, -16.47842, -15.18997, -12.3434, -8.23865, -3.30521, 1.9663, 7.07181, 11.52411, 14.91886, 16.94196, 17.36512, 16.10865, 13.2649, 9.07107, 3.92756, -1.63152, -7.04342, -11.78335, -15.40137, -17.51269, -17.85939, -16.40919, -13.34414, -8.9833, -3.74688, 1.82628, 7.17828, 11.81925, 15.32428, 17.52228, 18.43798, 17.96645, 16.00813, 12.64898, 8.12851, 2.85461, -2.67806, -7.97079, -12.52225, -15.9036, -17.82153, -18.09408, -16.64957, -13.58892, -9.23127, -4.02162, 1.5377, 6.90971, 11.61394, 15.25156, 17.51272, 18.19684, 17.21415, 14.62502, 10.64907, 5.655, 0.13975, -5.37074, -10.38468, -14.43028, -17.09434, -18.08931, -17.30625, -14.82944, -10.90165, -5.91199, -0.37409, 5.17325, 10.22907, 14.31545, 17.01563, 18.06496, 17.3666, 14.95999, 11.06203, 6.0747, 0.49757, -5.13507, -10.27114, -14.40219, -17.12098, -18.14661, -17.37654, -14.92535, -11.07757, -6.21776, -0.82722, 4.57663, 9.50545, 13.51201, 16.2428, 17.43614, 16.96121])
sampleRate = 1e6
sampleTime = np.arange(samples.size) / sampleRate

iTime, iSamples = interpolate_hard(sampleTime, samples)
plt.plot(sampleTime, samples, label = 'Samples')
plt.plot(iTime, iSamples, label = 'Interpolated')
plt.legend()
plt.show()

Функция работает невероятно долго. Я даже не стал дожидаться, когда эта программа завершится. Если ограничить размер сигнала 500-ми точками, то обработка у меня выполняется примерно 5 секунд.

Какие проблемы я здесь вижу?

Во-первых, это вычисление функции кардинального синуса на каждом шаге алгоритма, в то время как значения часто будут повторяться. Во-вторых, сама свёртка - крайне медленная операция. А с учётом того, что это потом нужно будет переносить в контроллер, требуется найти более быстрое решение.

Как я дальше решал

Я подумал, как можно здесь использовать стандартные функции convolve. На схеме ниже в верхней строке исходный сигнал, в нижней строке значения функции кардинального синуса для первых двух точек интерполированного сигнала, внутри квадратов - индексы.


Из схемы следует, что необходимо рассчитать numValuesToInsert+1 разных ядер свёртки и выполнить операцию свёртки исходного сигнала с каждым из них. С учётом того, что свёртка сигнала с 0-м ядром даст тот же сигнал, то эту операцию выполнять бессмысленно: можно просто взять значения из исходного сигнала. Так появилась новая реализация:

def interpolate(time, samples, numValuesToInsert = 3):
    samplingPeriod = time[1] - time[0]
    N = samples.size
    iSamplingPeriod = samplingPeriod / (numValuesToInsert + 1)
    
    iSamples = np.empty(N * (numValuesToInsert + 1) - numValuesToInsert)
    # На позиции, кратные numValuesToInsert+1, копируем исходный сигнал
    iSamples[np.arange(0, iSamples.size) % (numValuesToInsert + 1) == 0] = samples
    
    for of in range(1, numValuesToInsert+1):
        # Расчёт ядра свёртки
        sinc = np.sinc(np.linspace((of * iSamplingPeriod - (N - 1) * samplingPeriod) / samplingPeriod, 
                                   ((N - 1) * samplingPeriod + of * iSamplingPeriod) / samplingPeriod, 
                                    N * 2 + 1))
        # Сама свёртка
        iS = signal.convolve(samples, sinc, 'full')[N:2*N]
        r = np.arange(0, iSamples.size) % (numValuesToInsert + 1) == of
        iS = iS[:r[r==True].size]
        # Копируем результат на нужные позиции
        iSamples[r] = iS

    iTime = np.linspace(time[0], time[-1], time.size * (numValuesToInsert + 1) - numValuesToInsert)
    return iTime, iSamples

Эта функция уже работает нормально.

Вопросы

Есть ли способы решить это с помощью одной свёртки? Какие есть другие алгоритмы (например, в частотной области), с помощью которых можно достичь такого же результата?

Ответы

Ответов пока нет.