Как минимум три вещи не так:
Во-первых, вы не суммируете по всем частотам в вашем IDFT. Это большая, большая проблема, в основном эквивалентная тому, чтобы брать только IDFT одной дискретной частоты вместо полных данных частотной области.
Во-вторых, в вашем IDFT перевернут знак.
Измените строку 5 фрагмента 2 на
doubleValue[n] += freq_real[k] * Math.cos(val) + freq_imag[k] * Math.sin(val);
и убедитесь, что вы инициализируете doubleValue нулями.
В-третьих, вы захотите добавить шаг нормализации;
Изменить строку 7 фрагмента 2 на
time_real[n] = (byte) (Math.floor(doubleValue[n] / data.length))
В-четвертых, для вашего удобства протестируйте этот алгоритм с плавающей запятой, используя входы и выходы с плавающей запятой, прежде чем усекать до целочисленного типа данных, и не думайте, что вы получите точно правильные ответы, совершая циклический переход по интегральным данным. - ошибка с плавающей точкой очень реальна.
Это может также помочь захватить чужую реализацию DFT и IDFT и сравнить поведение с вашей реализацией на некоторых очень простых входных данных для обнаружения других ошибок. Поскольку ДПФ является линейной алгеброй, вы можете получить ее не совсем правильно и все же увидеть качественно хорошо выглядящие ответы.