You are doing the core math in reverse, never seen it done that way but its still equally wrong. In the same way that 4 cores @ 3GHz each is not 1 core at 12GHz, a 3GHz hyper threaded core is not 2 cores at 1.5GHz.
That image shows it pretty well. In the event of all programs there are places where data dependencies show up and you have to wait for A*B=C to finish before you can do A+C, hyper threading slips instructions from another thread in during those pauses so that each portion of the CPU spends less time sitting there doing nothing, if there is only one thread running on the core it will behave exactly as if hyperthreading was disabled as there is nothing to interleave into the spaces. In the event that two threads are happening on a core, the one in the primary logical core gets priority and the one in the second core fills in the spaces when it can, this slows down the second thread quite a bit but your overall throughput is increased significantly even though the latency of thread 2 has increased.